zoukankan      html  css  js  c++  java
  • SDWebImage 图片缓存机制

    SDWebImage与iOS系统自带的缓存相比,优势是什么?

    从iOS5开始,iOS NSURLCache对于原生得HTTP Response做内存和磁盘缓存。每一次缓存命中(缓存命中就是说内存或者磁盘中有要请求的数据)的时候,app必须把原生的数据转成UIImage。这需要很多操作,比如数据分析转化、内存拷贝等等。

    另一方面,SDWebImage在内存中缓存UIImage,在磁盘上存原来的压缩的(但是,已经解码)image文件。UIImage用NSCache存在内存里,所以不需要拷贝操作,并且只要app需要内存,内存就可以被释放。

    除此之外,你第一次在一个UIImageView中用UIImage的时候,图片解压通常在主线程,而在SDWebImageDecoder强制解压错做在后台(不在主线程)做。

    SDWebImage提供了三个category来进行缓存:

    • MKAnnotationView(WebCache)
    • UIButton(WebCache)
    • UIImageView(WebCache)

    SDWebImage的缓存机制(以UIImageView为例):

    1. UIImageView+WebCache:  setImageWithURL:placeholderImage:options: 先显示 placeholderImage ,同时由SDWebImageManager 根据 URL 来在本地查找图片。
    2. SDWebImageManager: downloadWithURL:delegate:options:userInfo: SDWebImageManager是将UIImageView+WebCache同SDImageCache链接起来的类, SDImageCache: queryDiskCacheForKey:delegate:userInfo:用来从缓存根据CacheKey查找图片是否已经在缓存中
    3. 如果内存中已经有图片缓存, SDWebImageManager会回调SDImageCacheDelegate : imageCache:didFindImage:forKey:userInfo:
    4. 而 UIImageView+WebCache 则回调SDWebImageManagerDelegate:  webImageManager:didFinishWithImage:来显示图片。
    5. 如果内存中没有图片缓存,那么生成 NSInvocationOperation 添加到队列,从硬盘查找图片是否已被下载缓存。
    6. 根据 URLKey 在硬盘缓存目录下尝试读取图片文件。这一步是在 NSOperation 进行的操作,所以回主线程进行结果回调 notifyDelegate:
    7. 如果上一操作从硬盘读取到了图片,将图片添加到内存缓存中(如果空闲内存过小,会先清空内存缓存)。SDImageCacheDelegate 回调 imageCache:didFindImage:forKey:userInfo:。进而回调展示图片。
    8. 如果从硬盘缓存目录读取不到图片,说明所有缓存都不存在该图片,需要下载图片,回调 imageCache:didNotFindImageForKey:userInfo:
    9. 共享或重新生成一个下载器 SDWebImageDownloader 开始下载图片。
    10. 图片下载由 NSURLConnection 来做,实现相关 delegate 来判断图片下载中、下载完成和下载失败。
    11. connection:didReceiveData: 中利用 ImageIO 做了按图片下载进度加载效果。
    12. connectionDidFinishLoading: 数据下载完成后交给 SDWebImageDecoder 做图片解码处理。
    13. 图片解码处理在一个 NSOperationQueue 完成,不会拖慢主线程 UI。如果有需要对下载的图片进行二次处理,最好也在这里完成,效率会好很多。
    14. 在主线程 notifyDelegateOnMainThreadWithInfo: 宣告解码完成,imageDecoder:didFinishDecodingImage:userInfo: 回调给 SDWebImageDownloader。
    15. imageDownloader:didFinishWithImage: 回调给 SDWebImageManager 告知图片下载完成。
    16. 通知所有的 downloadDelegates 下载完成,回调给需要的地方展示图片。
    17. 将图片保存到 SDImageCache 中,内存缓存和硬盘缓存同时保存。
    18. 写文件到硬盘在单独 NSInvocationOperation 中完成,避免拖慢主线程。
    19.  如果是在iOS上运行,SDImageCache 在初始化的时候会注册notification 到 UIApplicationDidReceiveMemoryWarningNotification 以及  UIApplicationWillTerminateNotification,在内存警告的时候清理内存图片缓存,应用结束的时候清理过期图片。
    20. SDWebImagePrefetcher 可以预先下载图片,方便后续使用。

    转自:http://www.overcode.hk/?p=449

    文章版权归个人所有,转载时请在文章显眼位置给出本文链接。
  • 相关阅读:
    phpcms后台进入地址(包含No permission resources错误)
    phpmyadmin上传大sql文件办法
    ubuntu彻底卸载mysql
    Hdoj 2602.Bone Collector 题解
    一篇看懂词向量
    Hdoj 1905.Pseudoprime numbers 题解
    The Python Challenge 谜题全解(持续更新)
    Hdoj 2289.Cup 题解
    Hdoj 2899.Strange fuction 题解
    Hdoj 2199.Can you solve this equation? 题解
  • 原文地址:https://www.cnblogs.com/xjshi/p/4389342.html
Copyright © 2011-2022 走看看