SDWebImage内部实现过程

1.入口setImageWithURL:placeholderImager:options:会把先placeholderImage显示,然后SDWebImageManager根据URL开始处理图片

2.进入SDWbImageManger-downloadWithURL:delegate:options:userInfo;交给SDImageCache从缓存查找图片是否已经下载queryDiskCacheForKey:delegate:userInfo

3.下从内存图片缓存查找是否有图片,如果内存中已经有图片缓存,SDImageCacheDelegate回调imagerCacheLdudFindImage:forKey:userInfo:到SDWedImageManager.

4.SDImageManagerDelegate回调webImageManager:didFinishWithImage:到UIImageView+WebCache等前端展示图片

5如果内存缓冲中没有,声称NSinvocationOperation添加到队列开始从硬盘查找图片是否已经缓存

6.根据URLKey在硬盘缓存目录下尝试读取图片文件,这一步是在NSOperation进行操作,所以回祝线程进行结果回调notifyDelegate.

7.如果上衣操作从硬盘中读取到图片,将图片添加到内存缓冲中,(如果内存缓冲太小,则需要清理内存缓冲)SDImageCacheDelegate回调imageCche:didFindImage:forKey:userInfo,尽心回调展示图片

8.如果在硬盘缓存目录下没有读取到图片,则说明所有缓冲机制中都没有这张图片,则需要下载图片,回调imagecache:didNotFindImageForKey:userinfo

9.共享或重新生成一个下载器SDWebImageDownloader开始下载图片

10.图片下载由NSURLConnection来做,实现相关的delegate来判断图片在下载中,下载取消,下载完成

11.connection:didReceiveData中利用ImageIO做了按图片下载进度加载效果

12.connectionDidFinishLoading:数据下载完成后交给SDWedImageDecoder做图片解码处理

13.图片解码处理在一个NSOperationQueue完成,不会拖累主线程。如果需要对下载兔攀进行二次出来,最好也在这里完成,效果会好很多

14.在祝线程notifyDelegateOnMainTgreadWithInfo:宣告解码完成,imageDecoder:didFinishDecodingImage:userinfo:回调给SDWedImageDownlader.

15imagerDownloader:didFinishWithimage:回调给SDWedimagerManager告知图片下载完成

16.通知所有的downloadDelegates下载完成,回调给需要的地方展示图片

17.将图片保存到SDImageCache中,内存缓存和硬盘同时保存,写入硬盘也在以单独NSInvocationOperation完成,皮棉拖累主线程

18.SDImageCache在初始化的时候回注册一些消息通知,在内存警告或后退后台的时候清理内存图片缓存,应用结束的时候清理过期图片

19.SDWI也提供了UIButton+webcache和MKAnnotaionView+WebCache,方便实用

20.SDWebImagerPrefetcher可以预先下载图片,方便后续使用

UIBttion的父类是UIControl,UIControl的父类是UIView,UIView的父类UIResponder

你可能感兴趣的:(SDWebImage内部实现过程)