当前位置: 移动技术网 > IT编程>移动开发>IOS > iOS 图片加载框架SDWebImage解读

iOS 图片加载框架SDWebImage解读

2019年07月24日  | 移动技术网IT编程  | 我要评论

终我一生 宠你到老,女生读什么职高好,天津烟草网上订货

目的

在使用sdwebimage加载图片时,尤其是加载gif等大图时,sdwebimage会将图片缓存在内存中,这样是非常吃内存的,这时我们就需要在适当的时候去释放一下sdwebimage的内存缓存,才不至于造成app闪退。

sdwebimage 提供了 uiimageview、uibutton 、mkannotationview 的图片下载分类,只要一行代码就可以实现图片异步下载和缓存功能。

这样开发者就无须花太多精力在图片下载细节上,专心处理业务逻辑。

sdwebimage 特点

  1. 提供 uiimageview, uibutton, mkannotationview 的分类,用来显示网络图片,以及缓存管理
  2. 异步下载图片
  3. 异步缓存(内存+磁盘),并且自动管理缓存有效性
  4. 后台图片解压缩
  5. 同一个 url 不会重复下载
  6. 自动识别无效 url,不会反复重试
  7. 不阻塞主线程
  8. 高性能
  9. 使用 gcd 和 arc
  10. 支持多种图片格式(包括 webp 格式)
  11. 支持动图(gif)
  12. 4.0 之前的动图效果并不是太好
  13. 4.0 以后基于 flanimatedimage加载动图

注:本文选读的代码是 3.7.3 版本的,所以动图加载还不支持 flanimatedimage。

sdwebimage 使用

1. uitableview 中使用 uiimageview+webcache

复制代码 代码如下:

[cell.imageview sd_setimagewithurl:[nsurl urlwithstring:@""] 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];
```![](http://upload-images.jianshu.io/upload_images/2829694-48307b4d71bc5800.jpg?imagemogr2/auto-orient/strip%7cimageview2/2/w/300)

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

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

  • ios uicollectionview实现横向滚动

    现在使用卡片效果的app很多,之前公司让实现一种卡片效果,就写了一篇关于实现卡片的文章。文章最后附有demo实现上我选择了使用uicollectionview ... [阅读全文]
  • iOS UICollectionView实现横向滑动

    本文实例为大家分享了ios uicollectionview实现横向滑动的具体代码,供大家参考,具体内容如下uicollectionview的横向滚动,目前我使... [阅读全文]
  • iOS13适配深色模式(Dark Mode)的实现

    iOS13适配深色模式(Dark Mode)的实现

    好像大概也许是一年前, mac os系统发布了深色模式外观, 看着挺刺激, 时至今日用着也还挺爽的终于, 随着iphone11等新手机的发售, ios 13系统... [阅读全文]
  • ios 使用xcode11 新建项目工程的步骤详解

    ios 使用xcode11 新建项目工程的步骤详解

    xcode11新建项目工程,新增了scenedelegate这个类,转而将原appdelegate负责的对ui生命周期的处理担子接了过来。故此可以理解为:ios... [阅读全文]
  • iOS实现转盘效果

    本文实例为大家分享了ios实现转盘效果的具体代码,供大家参考,具体内容如下demo下载地址: ios转盘效果功能:实现了常用的ios转盘效果,轮盘抽奖效果的实现... [阅读全文]
  • iOS开发实现转盘功能

    本文实例为大家分享了ios实现转盘功能的具体代码,供大家参考,具体内容如下今天给同学们讲解一下一个转盘选号的功能,直接上代码直接看viewcontroller#... [阅读全文]
  • iOS实现轮盘动态效果

    本文实例为大家分享了ios实现轮盘动态效果的具体代码,供大家参考,具体内容如下一个常用的绘图,主要用来打分之类的动画,效果如下。主要是ios的绘图和动画,本来想... [阅读全文]
  • iOS实现九宫格连线手势解锁

    本文实例为大家分享了ios实现九宫格连线手势解锁的具体代码,供大家参考,具体内容如下demo下载地址:效果图:核心代码://// clockview.m// 手... [阅读全文]
  • iOS实现卡片堆叠效果

    本文实例为大家分享了ios实现卡片堆叠效果的具体代码,供大家参考,具体内容如下如图,这就是最终效果。去年安卓5.0发布的时候,当我看到安卓全新的material... [阅读全文]
  • iOS利用余弦函数实现卡片浏览工具

    iOS利用余弦函数实现卡片浏览工具

    本文实例为大家分享了ios利用余弦函数实现卡片浏览工具的具体代码,供大家参考,具体内容如下一、实现效果通过拖拽屏幕实现卡片移动,左右两侧的卡片随着拖动变小,中间... [阅读全文]
验证码:
移动技术网