iOS 图片加载框架SDWebImage解读

时间:2021-05-20

目的

在使用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://pleted:^(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];```![](http://upload-images.jianshu.io/upload_images/2829694-48307b4d71bc5800.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/300)

    以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。

    声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。

    相关文章