SDWebImage原理浅析

遇见你之前,我只有眼前的苟且,遇见你之后,才有了诗和远方。

  1. 话不多说,我们最熟悉的sd_setImageWithURL:placeholderImage:sd_setImageWithURL:placeholderImage:options:,会先把placeholderImage显示,然后SDWebImageManager根据URL处理图片。

  2. 进入 SDWebImageManager-downloadWithURL:options:progress:completed:,交给 SDImageCache 从缓存查找图片是否已经下载queryDiskCacheForKey:done:

  3. 先从内存图片缓存查找是否有图片,源码:

UIImage *image = [self imageFromMemoryCacheForKey:key];
if (image) {
        doneBlock(image, SDImageCacheTypeMemory);
        return nil;
    }

如果内存中已经有图片缓存,SDImageCache 回调 SDWebImageQueryCompletedBlock()SDWebImageManager

  1. SDWebImageCompletionBlock回调SDWebImageCompletionWithFinishedBlockUIImageView+WebCache等前端展示图片。

  2. 如果内存缓存中没有,开启异步线程从硬盘查找图片是否已经缓存。根据 URLKey 在硬盘缓存目录下尝试读取图片文件。源码:

@autoreleasepool {
            UIImage *diskImage = [self diskImageForKey:key];
            if (diskImage && self.shouldCacheImagesInMemory) {
                NSUInteger cost = SDCacheCostForImage(diskImage);
                [self.memCache setObject:diskImage forKey:key cost:cost];
            }

            dispatch_async(dispatch_get_main_queue(), ^{
                doneBlock(diskImage, SDImageCacheTypeDisk);
            });
        }

如果上一操作从硬盘读取到了图片,将图片添加到内存缓存中(如果空闲内存过小,会先清空内存缓存)。SDImageCache回调 SDWebImageQueryCompletedBlock,进而回调展示图片。

  1. 如果从硬盘缓存目录读取不到图片,说明所有缓存都不存在该图片,需要下载图片,重新生成一个下载器 SDWebImageDownloader开始下载图片。

  2. 图片下载由 NSMutableURLRequest来做,实现相关block来判断图片下载中、下载完成和下载失败。

  3. 至于下载后图片如何处理,解码等并未研究,一旦图片解码完成,相关block回调,得到downloadedImage,回调给需要的地方展示图片。将图片保存到 SDImageCache 中,内存缓存和硬盘缓存同时保存。

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

10.缓存大小与清除

NSInteger size = [[SDImageCache sharedImageCache] getSize];
[[SDImageCache sharedImageCache] clearDiskOnCompletion:^{
   NSLog(@"清除成功");
}];

你可能感兴趣的:(SDWebImage原理浅析)