天天看点

【无限互联】浅析开源框架SDWebImage

本节要点

1.SDWebImage的功能和基本用法

2.SDWebImage的实现原理

SDWebImage的功能

SDWebImage提供了一个UIImageView类别以支持加载来自网络的远程图片,具有缓存管理,异步加载等特性

SDWebImage的基本用法

#import导入"UIImageView+WebCache.h",调用如下方法可实现加载网络图片,并可以设置图片加载前的默认图片,监听图片加载进度以及图片加载完成事件

[_imageView setImageWithURL:url placeholderImage:nil options:SDWebImageRetryFailed progress:^(NSInteger receivedSize, NSInteger   expectedSize) {//查看下载进度
        NSLog(@"receive = %d,expected = %d",receivedSize,expectedSize);
    } completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType) {//加载成功后调用
        NSLog(@"加载成功");
    }];
           

基本方法为:- ( void)setImageWithURL:( NSURL *)url;

调用此方法时,会对加载的图片作出判断,若是GIF图,则会调用”UIImage+GIF"中的方法+ (UIImage *)sd_animatedGIFWithData:(NSData *)data;使UIImageView显示GIF动图

#import导入"SDWebImageManager.h",使用SDWebImageManager类可以对网络图片的加载进行管理,它可以读取imageCache(图片缓存)和imageDownloader(图片下载器),实现SDImageCache和SDWebImageDownloader的回调,从而进行一些异步加载的工作

SDWebImageManager *manager = [SDWebImageManager sharedManager];
   [manager downloadWithURL:url options:SDWebImageRetryFailed progress:NULL completed:^(UIImage *image, NSError *error,              SDImageCacheType cacheType, BOOL finished) {
       _imgView.image = image;
   }];
           

调用此方法会下载URL所指向的网络图片(如果本地无缓存的话),并且可以监听下载进度以及下载完成事件

#import导入"SDWebImageDownloader.h",可以使用独立的异步图像下载

SDWebImageDownloader *downloader = [SDWebImageDownloader sharedDownloader];
    [downloader downloadImageWithURL:url options:SDWebImageDownloaderUseNSURLCache progress:NULL completed:^(UIImage *image,          NSData *data, NSError *error, BOOL finished) {
        _imgView.image = image;
    }];
           

#import导入“SDImageCache.h”可实现储存加载的图像到缓存,并且可以找出储存的缓存,使图片显示

SDWebImageDownloader *downloader = [SDWebImageDownloader sharedDownloader];
    SDImageCache *cache = [SDImageCache sharedImageCache];
    [downloader downloadImageWithURL:url options:SDWebImageDownloaderUseNSURLCache progress:NULL completed:^(UIImage *image,          NSData *data, NSError *error, BOOL finished) {
        [cache storeImage:image forKey:@"myCache"];
    }];
    UIImage *img = [cache imageFromDiskCacheForKey:@"myCache"];
    _imgView.image = img;
           

SDWebImage清除缓存的方法

[[SDWebImageManager sharedManager].imageCache clearDisk];
    [[SDWebImageManager sharedManager].imageCache clearMemory];
           

SDWebImage的实现原理

(1)- ( void)setImageWithURL:( NSURL *)url placeholderImage:( UIImage *)placeholder options:( SDWebImageOptions)options progress:( SDWebImageDownloaderProgressBlock)progressBlock completed:( SDWebImageCompletedBlock)completedBlock;调用此函数实现网络图片加载时,首先会将placeholder设为未加载图片时的默认图片,然后SDWebImageManager会通过URL处理图像

(2)调用- (id <SDWebImageOperation>)downloadWithURL:(NSURL *)url options:(SDWebImageOptions)options progress:(SDWebImageDownloaderProgressBlock)progressBlock completed:(SDWebImageCompletedWithFinishedBlock)completedBlock方法对URL进行判断,创建新的

SDWebImageCombinedOperation

(3)然后通过SDImageCache调用- (NSOperation *)queryDiskCacheForKey:(NSString *)key done:(void (^)(UIImage *image,SDImageCacheType cacheType))doneBlock,先检查内存,若没有再检查硬盘缓存目录中是否存在图片缓存,若存在,则通过doneBlock块,将缓存图片传给SDWebImageManager,再交由UIImageView显示,若没有,则生成SDWebImageDownloader,通过方法- (id <SDWebImageOperation>)downloadImageWithURL:(NSURL *)url options:(SDWebImageDownloaderOptions)options progress:(void (^)(NSInteger,NSInteger))progressBlock completed:(void (^)(UIImage *,NSData *,NSError *,BOOL))completedBlock开始下载图片

(4)通过NSURLConnection来实现图片下载,通过NSURLConnection的delegate来监听图片的下载开始,下载过程以及下载结束

(5)connectionDidFinishLoading:图片下载完成后,通过sd_imageWithData:来判断图片的格式,并对不同的格式进行不同的处理

(6)decodedImageWithImage:对图片进行解码处理,解码完成后调用completionBlock,将数据传出给SDWebImageDownloader,再UIImageView显示图片

(7)将图片保存到SDImageCache中