<p><span style="color:rgb(51,51,51)">SDWebImage</span></p>
<p><span style="color:rgb(51,51,51)">这个类库提供一个</span><span style="color:rgb(51,51,51)">UIImageView</span><span style="color:rgb(51,51,51)">类别以支持加载来自网络的远程图片。具有缓存管理、异步下载、同一个</span><span style="color:rgb(51,51,51)">URL</span><span style="color:rgb(51,51,51)">下载次数控制和优化等特征。</span></p>
<p> </p>
<p><span style="color:rgb(51,102,153)">SDWebImage</span><span style="color:rgb(51,51,51)"> </span><span style="color:rgb(51,51,51)">支持异步的图片下载</span><span style="color:rgb(51,51,51)">+</span><span style="color:rgb(51,51,51)">缓存,提供了</span><span style="color:rgb(51,51,51)"> UIImageView+WebCacha </span><span style="color:rgb(51,51,51)">的</span><span style="color:rgb(51,51,51)"> category</span><span style="color:rgb(51,51,51)">,方便使用。</span><span style="color:rgb(51,51,51)">SDWebImage</span><span style="color:rgb(51,51,51)">加载图片的流程:</span></p>
<p align="left">1. <span style="color:rgb(51,51,51)">入口</span><span style="color:rgb(51,51,51)"> setImageWithURL:placeholderImage:options: </span><span style="color:rgb(51,51,51)">会先把</span><span style="color:rgb(51,51,51)"> placeholderImage</span><span style="color:rgb(51,51,51)">显示,然后</span><span style="color:rgb(51,51,51)"> SDWebImageManager </span><span style="color:rgb(51,51,51)">根据</span><span style="color:rgb(51,51,51)"> URL </span><span style="color:rgb(51,51,51)">开始处理图片。</span></p>
<p align="left">2. <span style="color:rgb(51,51,51)">进入</span><span style="color:rgb(51,51,51)"> SDWebImageManager-downloadWithURL:delegate:options:userInfo:</span><span style="color:rgb(51,51,51)">,交给</span><span style="color:rgb(51,51,51)"> SDImageCache </span><span style="color:rgb(51,51,51)">从缓存查找图片是否已经下载</span><span style="color:rgb(51,51,51)"> queryDiskCacheForKey:delegate:userInfo:.</span></p>
<p align="left">3. <span style="color:rgb(51,51,51)">先从内存图片缓存查找是否有图片,如果内存中已经有图片缓存,</span><span style="color:rgb(51,51,51)">SDImageCacheDelegate</span><span style="color:rgb(51,51,51)">回调</span><span style="color:rgb(51,51,51)"> imageCache:didFindImage:forKey:userInfo: </span><span style="color:rgb(51,51,51)">到</span><span style="color:rgb(51,51,51)"> SDWebImageManager</span><span style="color:rgb(51,51,51)">。</span></p>
<p align="left">4. <span style="color:rgb(51,51,51)">SDWebImageManagerDelegate </span><span style="color:rgb(51,51,51)">回调</span><span style="color:rgb(51,51,51)"> webImageManager:didFinishWithImage: </span><span style="color:rgb(51,51,51)">到</span><span style="color:rgb(51,51,51)"> UIImageView+WebCache</span><span style="color:rgb(51,51,51)">等前端展示图片。</span></p>
<p align="left">5. <span style="color:rgb(51,51,51)">如果内存缓存中没有,生成</span><span style="color:rgb(51,51,51)"> NSInvocationOperation</span><span style="color:rgb(51,51,51)">添加到队列开始从硬盘查找图片是否已经缓存。</span></p>
<p align="left">6. <span style="color:rgb(51,51,51)">根据</span><span style="color:rgb(51,51,51)"> URLKey</span><span style="color:rgb(51,51,51)">在硬盘缓存目录下尝试读取图片文件。这一步是在</span><span style="color:rgb(51,51,51)"> NSOperation </span><span style="color:rgb(51,51,51)">进行的操作,所以回主线程进行结果回调</span><span style="color:rgb(51,51,51)"> notifyDelegate:</span><span style="color:rgb(51,51,51)">。</span></p>
<p align="left">7. <span style="color:rgb(51,51,51)">如果上一操作从硬盘读取到了图片,将图片添加到内存缓存中(如果空闲内存过小,会先清空内存缓存)。</span><span style="color:rgb(51,51,51)">SDImageCacheDelegate</span><span style="color:rgb(51,51,51)">回调</span><span style="color:rgb(51,51,51)"> imageCache:didFindImage:forKey:userInfo:</span><span style="color:rgb(51,51,51)">。进而回调展示图片。</span></p>
<p align="left">8. <span style="color:rgb(51,51,51)">如果从硬盘缓存目录读取不到图片,说明所有缓存都不存在该图片,需要下载图片,回调</span><span style="color:rgb(51,51,51)"> imageCache:didNotFindImageForKey:userInfo:</span><span style="color:rgb(51,51,51)">。</span></p>
<p align="left">9. <span style="color:rgb(51,51,51)">共享或重新生成一个下载器</span><span style="color:rgb(51,51,51)"> SDWebImageDownloader </span><span style="color:rgb(51,51,51)">开始下载图片。</span></p>
<p align="left">10. <span style="color:rgb(51,51,51)">图片下载由</span><span style="color:rgb(51,51,51)"> NSURLConnection</span><span style="color:rgb(51,51,51)">来做,实现相关</span><span style="color:rgb(51,51,51)"> delegate </span><span style="color:rgb(51,51,51)">来判断图片下载中、下载完成和下载失败。</span></p>
<p align="left">11. <span style="color:rgb(51,51,51)">connection:didReceiveData: </span><span style="color:rgb(51,51,51)">中利用</span><span style="color:rgb(51,51,51)"> ImageIO</span><span style="color:rgb(51,51,51)">做了按图片下载进度加载效果。</span></p>
<p align="left">12. <span |
|