iOS 图片加载框架SDWebImage详解

目的缓存

在使用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 使用dom

  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 的使用url

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

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 来下载图片,可是图片内容不会缓存。code

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];

相关文章
相关标签/搜索