1、SDWebImage介绍
一、在项目的开发过程当中,咱们常常会用到异步加载图片的功能,先从网络上异步下载图片,而后经过UIImageView显示在屏幕上。这是一个常常使用的功能,基本上全部的联网应用程序都要用到的功能,如今GitHub上已经有很是成熟的框架。github
SDWebImage(提供异步加载图片、缓存管理,下载进度等,功能最齐全)
EGOImageLoading(以前使用的框架,缓存管理不如SDWebImage设计简单)
AFNetworking (只提供异步加载图片功能,无缓存管理)
这里主要介绍SDWebImage,这个框架用的最多,在GitHub上已经给出框架的一些使用方法(详情https://github.com/rs/SDWebImage),咱们直接下载这个框架,运行里面的Demo发现Xcode会报编译错误,这是由于SDWebImage在项目中引用了GitHub的另一个项目libwebp的项目,若是要运行Demo网上已经给出了解决办法。web
二、咱们只是使用异步加载图片及缓存管理的相关功能,不须要libwebp项目,新建项目,将SDWebImage目录下的源代码直接加到项目中缓存
2、使用SDWebImage提供的类扩展实现异步加载图片 一、SDWebImage提供了UIImageView的扩展类,只须要在头文件中加入文件引用服务器
#import "UIImageView+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];
3、缓存的计算及清理 一、缓存计算,这里的缓存计算,只计算SDWebImage的缓存,沙盒文件夹中的其它文件并不包括在内:url
[SDWebImageManager.sharedManager.imageCache calculateSizeWithCompletionBlock:^(NSUInteger fileCount, NSUInteger totalSize) { }];
二、缓存清理
在SDWebImage中有两种缓存,一种是磁盘缓存,一种为内存缓存,框架都提供了相应的方法:.net
[[[SDWebImageManager sharedManager] imageCache] clearDisk]; [[[SDWebImageManager sharedManager] imageCache] clearMemory];
不过这里要特别注意一下,在IOS7中你会发现使用这两个方法缓存总清除不干净,即便断网下仍是会有数据。这是由于在IOS7中,缓存机制作了修改,使用上述两个方法只清除了SDWebImage的缓存,没有清除系统的缓存,因此咱们能够在清除缓存的代理中额外添加如下:
[[NSURLCache sharedURLCache] removeAllCachedResponses];