本节要点
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中