图片下载框架概述
图片下载需要解决(考虑)哪些问题?
内存缓存
- FIFO双向队列+LRU双向队列+map数据结构。可以参考LKImageKit。
本地缓存
- 存储解码前的。解码后占用空间太大;
- 异步IO线程读取本地图片数据,sdWebImage解码是在异步单线程中,当瞬时加载大量图片时,可能会是性能瓶颈。可以尝试在多个线程进行解码。
合并请求
- 确保一张图片不会请求多次
- sdWebImage中,一个下载对应一个operation。多次重复请求时,添加多个block。
取消请求
- 可以只删除对应回调block。下载,解码,保存内存缓存,保存磁盘缓存照样继续进行。(快速滑动列表时,很大概率会再划过来)。
- 取消下载等操作。(一个下载operation,没有对应回调时直接cancle).
- 提供两种方案,根据不同业务形态进行选择。
主流图片格式解码方案?
- 子线程解码。SDWebImage使用串行队列进行解码。估计是为了实时下载,解码,显示(这种场景下,如果使用并发队列,顺序可能乱掉)这里应该可以优化。
- 如果只是下载结束后解码,可以考虑使用异步多线程解码。
- 解码格式主要有: Png/jpeg/webP等。 SDWebImage有对应解码模块。
- GIF:使用FLAnimatedImage
渐进式加载
- 可以逐行加载 或 模糊到清晰的加载,
- 参考sdwebImage。个人感觉从模糊到清晰的用户体验更好。
- 具体实施时,可以调研下主流APP是否渐进显示。
极致优化
参考框架