文档章节

iOS 图片加载框架SDWebImage详解

FBY展菲
 FBY展菲
发布于 2017/10/31 10:14
字数 1118
阅读 166
收藏 0

目的

在使用SDWebImage加载图片时,尤其是加载gif等大图时,SDWebImage会将图片缓存在内存中,这样是非常吃内存的,这时我们就需要在适当的时候去释放一下SDWebImage的内存缓存,才不至于造成APP闪退。 SDWebImage 提供了 UIImageView、UIButton 、MKAnnotationView 的图片下载分类,只要一行代码就可以实现图片异步下载和缓存功能。 这样开发者就无须花太多精力在图片下载细节上,专心处理业务逻辑。

SDWebImage 特点

提供 UIImageView, UIButton, MKAnnotationView 的分类,用来显示网络图片,以及缓存管理 异步下载图片 异步缓存(内存+磁盘),并且自动管理缓存有效性 后台图片解压缩 同一个 URL 不会重复下载 自动识别无效 URL,不会反复重试 不阻塞主线程 高性能 使用 GCD 和 ARC 支持多种图片格式(包括 WebP 格式) 支持动图(GIF) 4.0 之前的动图效果并不是太好 4.0 以后基于 FLAnimatedImage加载动图 注:本文选读的代码是 3.7.3 版本的,所以动图加载还不支持 FLAnimatedImage。 SDWebImage 使用

  1. UITableView 中使用 UIImageView+WebCache

[cell.imageView sd_setImageWithURL:[NSURL URLWithString:@"http://www.domain.com/path/to/image.jpg"] placeholderImage:[UIImage imageNamed:@"placeholder.png"]]; 2. 使用回调 blocks

在 block 中得到图片下载进度和图片加载完成(下载完成或者读取缓存)的回调,如果你在图片加载完成前取消了请求操作,就不会收到成功或失败的回调

[cell.imageView sd_setImageWithURL:[NSURL URLWithString:@"http://www.domain.com/path/to/image.jpg"] placeholderImage:[UIImage imageNamed:@"placeholder.png"] completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL) { ... completion code here ... }]; 3. SDWebImageManager 的使用

UIImageView(WebCache) 分类的核心在于 SDWebImageManager 的下载和缓存处理,SDWebImageManager将图片下载和图片缓存组合起来了。SDWebImageManager也可以单独使用。

SDWebImageManager *manager = [SDWebImageManager sharedManager]; [manager loadImageWithURL:imageURL options:0 progress:^(NSInteger receivedSize, NSInteger expectedSize) { // progression tracking code } completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, BOOL finished, NSURL *imageURL) { if (image) { // do something with image } }]; 4. 单独使用 SDWebImageDownloader 异步下载图片

我们还可以单独使用 SDWebImageDownloader 来下载图片,但是图片内容不会缓存。

SDWebImageDownloader *downloader = [SDWebImageDownloader sharedDownloader]; [downloader downloadImageWithURL:imageURL options:0 progress:^(NSInteger receivedSize, NSInteger expectedSize) { // progression tracking code } completed:^(UIImage *image, NSData *data, NSError *error, BOOL finished) { if (image && finished) { // do something with image } }]; 5. 单独使用 SDImageCache 异步缓存图片

SDImageCache 支持内存缓存和异步的磁盘缓存(可选),如果你想单独使用 SDImageCache 来缓存数据的话,可以使用单例,也可以创建一个有独立命名空间的 SDImageCache 实例。

添加缓存的方法:

[[SDImageCache sharedImageCache] storeImage:myImage forKey:myCacheKey]; 默认情况下,图片数据会同时缓存到内存和磁盘中,如果你想只要内存缓存的话,可以使用下面的方法:

[[SDImageCache sharedImageCache] storeImage:myImage forKey:myCacheKey toDisk:NO]; 读取缓存时可以使用 queryDiskCacheForKey:done: 方法,图片缓存的 key 是唯一的,通常就是图片的 absolute URL。

SDImageCache *imageCache = [[SDImageCache alloc] initWithNamespace:@"myNamespace"]; [imageCache queryDiskCacheForKey:myCacheKey done:^(UIImage *image) { // image is not nil if image was found }]; 6. 自定义缓存 key

有时候,一张图片的 URL 中的一部分可能是动态变化的(比如获取权限上的限制),所以我们只需要把 URL 中不变的部分作为缓存用的 key。

SDWebImageManager.sharedManager.cacheKeyFilter = ^(NSURL *url) { url = [[NSURL alloc] initWithScheme:url.scheme host:url.host path:url.path]; return [url absoluteString]; }; 常见问题

问题 1:使用 UITableViewCell 中的 imageView 加载不同尺寸的网络图片时会出现尺寸缩放问题。 解决方案: 自定义 UITableViewCell,重写 -layoutSubviews 方法,调整位置尺寸; 或者直接弃用 UITableViewCell 的 imageView,自己添加一个 imageView 作为子控件。 问题 2:图片刷新问题:SDWebImage 在进行缓存时忽略了所有服务器返回的 caching control 设置,并且在缓存时没有做时间限制,这也就意味着图片 URL 必须是静态的了,要求服务器上一个 URL 对应的图片内容不允许更新。但是如果存储图片的服务器不由自己控制,也就是说 图片内容更新了,URL 却没有更新,这种情况怎么办? 解决方案:在调用 sd_setImageWithURL: placeholderImage: options:方法时设置 options 参数为 SDWebImageRefreshCached,这样虽然会降低性能,但是下载图片时会照顾到服务器返回的 caching control。 问题 3:在加载图片时,如何添加默认的 progress indicator ? 解决方案:在调用 -sd_setImageWithURL:方法之前,先调用下面的方法: [imageView sd_setShowActivityIndicatorView:YES]; [imageView sd_setIndicatorStyle:UIActivityIndicatorViewStyleGray];

© 著作权归作者所有

FBY展菲
粉丝 1
博文 23
码字总数 23719
作品 0
浦东
程序员
私信 提问
使用SDWebImage时常遇到的问题

1. 图片文件缓存的时间有多长:1周 2. SDWebImage 的内存缓存是用什么实现的? 3. SDWebImage 的最大并发数是多少? 4. SDWebImage 支持动图吗?GIF 5. SDWebImage的最大超时时长 6. SDWebIm...

_小迷糊
2018/05/07
0
0
SDWebImage 4.1.1 发布,iOS 图片加载框架

SDWebImage 4.1.1 已发布,SDWebImage 是非常流行的 iOS 图片加载框架,提供了一个 UIImageView 的 category 用来加载网络图片并且对网络图片的缓存进行管理,采用异步方式来下载网络图片。更...

王练
2017/10/09
564
0
SDWebImage 4.3.1 发布,iOS 图片加载框架

SDWebImage 4.3.1 已发布,这是针对 4.3.0 的一个修复和改进版本。 SDWebImage 是非常流行的 iOS 图片加载框架,提供了一个 UIImageView 的 category 用来加载网络图片并且对网络图片的缓存进...

王练
2018/02/26
742
0
IOS使用SDWebImage出现unsupported parameter combination警告的解决方案

IOS使用SDWebImage出现下列类似警告的解决方案 CGBitmapContextCreate: unsupported parameter combination: 16 integer bits/component; 64 bits/pixel; 3-component color space; kCGImag......

开源中国搬砖小能手
2015/04/18
895
0
使用SDWebImage下载高分辨率图,导致内存暴增的解决办法

最近,遇到一个问题,有个控制器,一进去就crash,而且手机非常的烫,用instrument跑了跑,发现内存暴增几百兆;如图:   图中可以看出,内存暴增的罪魁祸首是YYImage,再进一步定位问题,如...

ocarol
2016/07/25
0
0

没有更多内容

加载失败,请刷新页面

加载更多

最简单的获取相机拍照的图片

  import android.content.Intent;import android.graphics.Bitmap;import android.os.Bundle;import android.os.Environment;import android.provider.MediaStore;import andr......

MrLins
今天
5
0
说好不哭!数据可视化深度干货,前端开发下一个涨薪点在这里~

随着互联网在各行各业的影响不断深入,数据规模越来越大,各企业也越来越重视数据的价值。作为一家专业的数据智能公司,个推从消息推送服务起家,经过多年的持续耕耘,积累沉淀了海量数据,在...

个推
今天
8
0
第三方支付-返回与回调注意事项

不管是支付宝,微信,还是其它第三方支付,第四方支付,支付机构服务商只要涉及到钱的交易都要进行如下校验,全部成功了才视为成功订单 1.http请求是否成功 2.校验商户号 3.校验订单号及状态...

Shingfi
今天
4
0
简述Java内存分配和回收策略以及Minor GC 和 Major GC(Full GC)

内存分配: 1. 栈区:栈可分为Java虚拟机和本地方法栈 2. 堆区:堆被所有线程共享,在虚拟机启动时创建,是唯一的目的是存放对象实例,是gc的主要区域。通常可分为两个区块年轻代和年老代。更...

DustinChan
今天
6
0
Excel插入批注:可在批注插入文字、形状、图片

1.批注一直显示:审阅选项卡-------->勾选显示批注选项: 2.插入批注快捷键:Shift+F2 组合键 3.在批注中插入图片:鼠标右键点击批注框的小圆点【重点不可以在批注文本框内点击】----->调出批...

东方墨天
今天
6
1

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部