iOS网络图片缓存SDWebImage
2014-05-06 23:33
435 查看
Web image(网络图像)
该库提供了一个支持来自Web的远程图像的UIImageView类别它提供了:
添加网络图像和缓存管理到Cocoa Touch framework的UIImageView类别
异步图像下载
An asynchronous memory + disk image caching with automatic cache expiration handling
支持GIF动画
支持WebP格式
后台图像解压
保证相同的url不会下载多次
保证伪造的URL不会尝试一遍又一遍的下载
保证主线程永远不会被阻塞
Performances!
使用GCD和ARC
注意:SDWebImage 3.0不向后兼容2.0并且最低需要iOS 5.0 的版本。如果你的iOS版本低于5.0,请使用2.0版本。
如何使用
API 文档地址 http://hackemist.com/SDWebImage/doc/。Using UIImageView+WebCache category with UITableView
仅需引入 UIImageView+WebCache.h 头文件,在UITableViewDataSource的方法tableView:cellForRowAtIndexPath:中调用setImageWithURL:placeholderImage:方法。从异步下载到缓存管理,一切都会为你处理。#import <SDWebImage/UIImageView+WebCache.h> ... - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { static NSString *MyIdentifier = @"MyIdentifier"; UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:MyIdentifier]; if (cell == nil) { cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:MyIdentifier] autorelease]; } // Here we use the new provided setImageWithURL: method to load the web image [cell.imageView setImageWithURL:[NSURL URLWithString:@"http://www.domain.com/path/to/image.jpg"] placeholderImage:[UIImage imageNamed:@"placeholder.png"]]; cell.textLabel.text = @"My Text"; return cell; }
Using blocks
使用blocks,你将被告知下载进度,完成时是成功还是失败:
// Here we use the new provided setImageWithURL: method to load the web image [cell.imageView setImageWithURL:[NSURL URLWithString:@"http://www.domain.com/path/to/image.jpg"] placeholderImage:[UIImage imageNamed:@"placeholder.png"] completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType) {... completion code here ...}];
注意:如果请求被取消,那么block不会被调用(无论成功还是失败)。
Using SDWebImageManager
The SDWebImageManager is the class behind the UIImageView+WebCache category. It ties the asynchronous downloader with the image cache store. You can use this class directly to benefit from web image downloading with caching in another context than a UIView (ie: with Cocoa)下面是如何使用SDWebImageManager的代码:
SDWebImageManager *manager = [SDWebImageManager sharedManager]; [manager downloadWithURL:imageURL options:0 progress:^(NSUInteger receivedSize, long long expectedSize) { // progression tracking code } completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType) { if (image) { // do something with image } }];
Using Asynchronous Image Downloader Independently
也能够独立地使用异步图像下载:
[SDWebImageDownloader.sharedDownloader downloadImageWithURL:imageURL options:0 progress:^(NSUInteger receivedSize, long long expectedSize) { // progression tracking code } completed:^(UIImage *image, NSData *data, NSError *error, BOOL finished) { if (image && finished) { // do something with image } }];
Using Asynchronous Image Caching Independently
也可以独立地使用基于异步的图像缓存存储。SDImageCache维护一个内存缓存和一个可选的磁盘缓存。磁盘高
速缓存的写操作是异步进行的,所以它不会给UI增加不必要的延迟 。
为了方便,SDImageCache类提供了一个单例,但是如果你想创建单独的缓存命名空间你也可以创建新的实例。
你可以使用imageForKey:方法来查找缓存,如果返回为nil,说明当前图像不拥有缓存。因此你负责生成并缓存它。缓存键(cache key)是一个程序中图像缓存的唯一标识符,他通常是图像的url。
SDImageCache *imageCache = [SDImageCache.alloc initWithNamespace:@"myNamespace"]; [imageCache queryDiskCacheForKey:myCacheKey done:^(UIImage *image) { // image is not nil if image was found }];
默认情况下,如果一个图像不能在内存缓存中找到,SDImageCache将会查找高速缓存。你可以调用替代的方法imageFromMemoryCacheForKey:来预防这种情况的发生。
存储一个图像到缓存,你可以使用storeImage:forKey: 方法:
[[SDImageCache sharedImageCache] storeImage:myImage forKey:myCacheKey];
默认情况下,图像将被存储在内存上的缓存以及磁盘上的缓存(异步)。如果你想只在内存中缓存,使用替代方法storeImage:forKey:toDisk:,第三个参数为负数。
Using cache key filter
有时你也许不想使用图像URL作为缓存键,因为URL可能是动态的(i.e.: for access control purpose)。SDWebImageManager provides a way to set a cache key filter that takes the NSURL as input, and output a cache key NSString(这句不大理解)。下面的示例在应用程序的委托中设置一个过滤器,在使用它的缓存键之前将从URL中删除任何查询字符串(The following example sets a filter in the application delegate that will remove any query-string from the URL before to use it as a cache key):
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { SDWebImageManager.sharedManager.cacheKeyFilter:^(NSURL *url) { url = [[[NSURL alloc] initWithScheme:url.scheme host:url.host path:url.path] autorelease]; return [url absoluteString]; }; // Your app init code... return YES; }
Using dynamic image size with UITableViewCell
UITableView通过第一个单元格设置的图像决定图像的尺寸。如果您的远程图像没有图像占位符的大小相同,您可能会遇到奇怪的变形缩放问题。下面的文章给出了一个方法来解决这个问题:http://www.wrichards.com/blog/2011/11/sdwebimage-fixed-width-cell-images/
Handle image refresh(控制图像刷新)
默认情况下,SDWebImage确实非常积极的缓存。它忽略了所有类型的通过HTTP服务器返回的缓存控制头,并且没有时间限制地缓存返回的图像。这意味着你的图像url是永远不会改变的、指向图像的静态url。如果指向的图片
发生了变化,那么url也会相应的跟着变化。
如果你不控制你的图像服务器,当它的内容更新时你不能改变它的url。Facebook头像就是这种情况的例子。在这种情况下,你可以使用SDWebImageRefreshCached的标志。这将稍微降低性能,但将会考虑到HTTP缓存控制头:
[imageView setImageWithURL:[NSURL URLWithString:@"https://graph.facebook.com/olivier.poitrey/picture"] placeholderImage:[UIImage imageNamed:@"avatar-placeholder.png"] options:SDWebImageRefreshCached];
Add a progress indicator(添加进度指示)
查看这个类别: https://github.com/JJSaccolo/UIActivityIndicator-for-SDWebImageInstallation(安装)
有两种方式使用SDWebImage:1.将文件全部拖入工程中;
2.将工程作为一个静态库拖入工程中。
Add the SDWebImage project to your project
Download and unzip the last version of the framework from the download pageRight-click on the project navigator and select "Add Files to "Your Project":
In the dialog, select SDWebImage.framework:
Check the "Copy items into destination group's folder (if needed)" checkbox
Add dependencies(添加依赖性)
In you application project app’s target settings, find the "Build Phases" section and open the "Link Binary With Libraries" block:Click the "+" button again and select the "ImageIO.framework"(还缺一个“MapKit.framework”,readme中没提到), this is needed by the progressive download feature:
Add Linker Flag(添加链接标志)
Open the "Build Settings" tab, in the "Linking" section, locate the "Other Linker Flags" setting and add the "-ObjC" flag:Import headers in your source files(导入头文件到你的资源文件中)
在你需要用到这个库的资源文件中导入下面的头文件:#import <SDWebImage/UIImageView+WebCache.h>
Build Project(编译工程)
这里你的工程应该是没有错误的。如果有,去google上找吧。Future Enhancements(未来增强功能)
LRU memory cache cleanup instead of reset on memory warning相关文章推荐
- iOS网络编程(三) 异步加载及缓存图片---->SDWebImage
- 【iOS】网络加载图片缓存与SDWebImage
- 【iOS】网络载入图片缓存与SDWebImage
- iOS网络编程(三) 异步加载及缓存图片---->SDWebImage
- 检测SDWebImage有没有缓存图片 IOS 获取网络图片大小
- iOS网络加载图片缓存与SDWebImage
- 【iOS】网络加载图片缓存与SDWebImage
- IOS网络图片缓存之SDWebImage
- iOS 下载缓存网络图片 SDWebImage
- iOS网络编程(三) 异步加载及缓存图片---->SDWebImage
- iOS网络编程(三) 异步加载及缓存图片---->SDWebImage
- 【iOS】网络加载图片缓存与SDWebImage
- iOS网络编程(三) 异步加载及缓存图片---->SDWebImage
- 检测SDWebImage有没有缓存图片 IOS 获取网络图片大小
- iOS 图片缓存框架SDWebImage使用方法(欢迎提建议和分享遇到的问题)
- IOS开发 SDWebImage获取网络图片的尺寸
- IOS-SDWebImage根据网络状态加载图片
- iOS: (库) 图片异步下载/缓存-SDWebImage的使用
- IOS开发-第三方SDWebImage下载网络图片的使用
- SDWebImage 异步加载网络图片 缓存…