[self.iconView setImageWithURL:[NSURL URLWithString:user.profile_image_url] placeholderImage:[UIImage imageWithName:@"avatar_default_small"]];
今天说说SDWebImage具体为我们做了哪些事:
1.调用setImageWithURL:placeholderImage:会先把placeholderImage显示。然后SDWebImageManager根据用户提供的URL开始处理图片。
2.进入SDWebImageManager:downloadWithURL:delegate:options,交给SDImageCache从缓存查找图片是否已经下载。
3.首先会从内存图片缓存中查找是否有该图片,如果有该图片,SDImageCacheDelegate回调imageCache:didFindImage:forKey:userInfo:到SDWebImageManager。
4.SDWebImageManagerDelegate回调webImageManager:didFinishWithImage:到UIImageView+WebCache到前端显示图片。
5.如果内存缓存中没有,生成NSInvocationOperation添加到队列开始从硬盘查找图片是否已经缓存。
6.根据URLKey在硬盘缓存目录下尝试读取图片文件。
7.如果步骤6从硬盘中读取到了图片,将图片添加到内存缓存中(如果空闲内存过小,会先清空内存缓存)。SDImageCacheDelegate回调imageCache:didFindImage:forkey展示图片。
8.如果从硬盘缓存目录中读取不到图片,说明所有缓存都不存在该图片,需要下载图片,回调imageCache:didNotFindImageForkey.
9.共享或重新生成一个下载器SDWebImageDownloader开始下载图片。
10.图片下载由NSURLConnection来完成,利用delegate判断图片下载中、下载完成和下载完成。同时也通过connection:didReceiveData:中利用ImageIO做了按图片下载进度加载效果。
11.connectionDidFinishLoading:图片下载完成后交给SDWebImageDecoder做图片解码处理。
12.图片解码处理在一个NSOperationQueue子线程完成,不会拖慢主线程UI。如果有需要对下载的图片进行二次处理,最好在解码过程完成,效果也会很好。
13.在主线程notifyDelegateOnMainThreadWithInfo:宣告解码完成,imageDecoder:didFinishDecodingImage:userInfo:回调给SDWebImageDownloader。
14.imageDownloader:didFinishWithImage:回调给SDWebImageManager告知图片下载完成。
15.利用通知消息机制告知所有的downloadDelegates下载完成,回调给需要的地方展示图片。
16.将下载的图片保存到SDImageCache中,同时也保存内存缓存和硬盘缓存。写文件到硬盘是单独在NSInvocationOperation完成,避免拖慢主线程。
17.SDImageCache在初始化的时候会注册一些消息通知,在内存警告或退到后台的时候清理内存图片缓存,应用结束的时候清理过期图片。