您的位置:首页 > 理论基础 > 计算机网络

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-SDWebImage

Installation(安装)

有两种方式使用SDWebImage:
1.将文件全部拖入工程中;
2.将工程作为一个静态库拖入工程中。

Add the SDWebImage project to your project

Download and unzip the last version of the framework from the download page

Right-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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: