一,首先,什么是 SDWebImage
1.SDWebImage 是在项目开发的过程当中,经常在异步加载图片的时候的开源框架.在日常的开发过程中,如果要缓存图片,首先要从网络上异步下载图片,然后通过 UIImageView将图片显示在屏幕上.这是一个经常使用的功能,基本上所有的联网应用程序都要用到的功能.
SDWebImage
(提供异步加载图片/缓存管理/下载进度等,功能最齐全)
EGOImageLoading(之前的框架,缓存管理的时候比不上SDWebImage
设计简单)
AFNetWorking( 只提供异步加载的功能,并无缓存管理);
2.在开发过程中,我们只使用它的异步加载图片及缓存管理的相关功能.
二.使用SDWebImage
提供的类扩展实现异步加载图片
1.SDWebImage
提供了 UIImageView 的扩展类.我们只需要在头文件中引用就可以了.
#import "UIImage+WebCache.h"
//异步加载图片的方法
- (void)setImageWithURL:(NSURL*)url placeholderImage:(UIImage*)placeholder;
/*
*url 图片的地址
*placeholder 网路图片在尚未加载成功时显示的图像
*/
默认情况下,SDWebImage
会忽略掉 Header 中的缓存设置,将图片以 URL 为 key 进行保存, url 与图片是一一对应关系.所以请求同一个 url 时,SDWebImage
会从缓存中取得图片.一般情况下用此方法可以满足我们的应用要求.但是如果你请求同一个 url, 而这张图片在服务器端更新了.本地客户端再次请求时还是会返回缓存中的就图片,例如加载头像类进场更新的图片时,就会出现头像不能更新的问题,由于 url 图片一一对应,一种解决的办法是改变部分 url 地址方式实现更新,不过这种方法操作起很复杂.所以
- (void)setImageWithUrl:(NSUrl *)url placeholderImage:(UIImage*)placeholder options:(SDWebImageOptions)options;
我们将第三个参数设置为SDWebImageRefreshCached
就可以实现图片更新了,使用方法很简单,如下:
NSURL *url = [NSURL URLWithString:@"http://www.example.com/image.png";
UIImage *defaultImage = [UIImage imageNamed:@"default.png"];
[self.imageView setImageWithURL:url placeholderImage:defaultImage options:SDWebImageRefreshCached];
三.缓存及清理.
在清除缓存之前,首先要进行缓存计算,只计算SDWebImage
的缓存,沙盒文件夹中的其它文件夹并不包括在内
[SDWebImageManager.sharedManager.imageCache calculateSizeWithCompletionBlock:^(NSUInteger fileCount,NSUInteger totalSize){}];
缓存清理
在SDWebImage
中有两种缓存,一种为内存缓存,另外一种为磁盘缓存,框架都提供了响应的方法:
//清楚磁盘缓存
[[[SDWebImageManager sharedManager] imageCache] clearDisk];
//清楚内存缓存
[[[SDWebImageManager sharedManager] imageCache] clearMemory];
不过这里要特别注意一下,在IOS7中你会发现使用这两个方法缓存总清除不干净,即使断网下还是会有数据。这是因为在IOS7中,缓存机制做了修改,使用上述两个方法只清除了SDWebImage的缓存,没有清除系统的缓存,所以我们可以在清除缓存的代理中额外添加以下:
[[NSURLCache sharedURLCache] removeAllCachedResponses];
网友评论