此库提供了一个用于UIImageView的分类,支持从网络获取远程图像。
它提供:
UIImageView
分类注意:SDWebImage 3.8版本需要iOS 7或更高版本(因为NSURLSession)。3.7到3.0版本需要iOS 5.1.1。如果您需要iOS < 5.0的支持,请使用最后的2.0版本。
了解谁在使用SDWebImage并将您的应用程序添加到列表中。
API文档可在CocoaDocs - SDWebImage找到。
只需导入UIImageView+WebCache.h
头文件,然后在UITableView的dataSource的tableView:cellForRowAtIndexPath:
方法中调用sd_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 sd_setImageWithURL: method to load the web image
[cell.imageView sd_setImageWithURL:[NSURL URLWithString:@"http://www.domain.com/path/to/image.jpg"]
placeholderImage:[UIImage imageNamed:@"placeholder.png"]];
cell.textLabel.text = @"My Text";
return cell;
}
使用blocks,您可以在下载进度和图像检索成功或失败时收到通知
// Here we use the new provided sd_setImageWithURL: method to load the web image
[cell.imageView sd_setImageWithURL:[NSURL URLWithString:@"http://www.domain.com/path/to/image.jpg"]
placeholderImage:[UIImage imageNamed:@"placeholder.png"]
completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL) {
... completion code here ...
}];
注意:如果您的图像请求在完成前被取消,则您的成功或失败块都不会被调用。
SDWebImageManager 是 UIImageView+WebCache 分类背后的类。它将异步下载器与图像缓存存储连接起来。您可以直接使用这个类,在不同于 UIView 的环境中受益于带有缓存的网络图像下载(即:使用 Cocoa)。
以下是使用 SDWebImageManager 的一个简单示例
SDWebImageManager *manager = [SDWebImageManager sharedManager];
[manager downloadImageWithURL:imageURL
options:0
progress:^(NSInteger receivedSize, NSInteger expectedSize) {
// progression tracking code
}
completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, BOOL finished, NSURL *imageURL) {
if (image) {
// do something with image
}
}];
也可以独立使用异步图像下载器
SDWebImageDownloader *downloader = [SDWebImageDownloader sharedDownloader];
[downloader downloadImageWithURL:imageURL
options:0
progress:^(NSInteger receivedSize, NSInteger expectedSize) {
// progression tracking code
}
completed:^(UIImage *image, NSData *data, NSError *error, BOOL finished) {
if (image && finished) {
// do something with image
}
}];
还可以独立使用基于异步的图像缓存存储。SDImageCache 维护一个内存缓存和一个可选的磁盘缓存。磁盘缓存写入操作是异步进行的,这样就不会给 UI 增加不必要的延迟。
SDImageCache 类提供了一个单例实例以便使用,但您可以根据需要创建自己的实例来创建分离的缓存命名空间。
要查找缓存,您使用 queryDiskCacheForKey:done:
方法。如果该方法返回 nil,则表示缓存目前不拥有该图像。因此,您负责生成和缓存它。缓存键是用于缓存的图像的整个应用程序唯一标识符。它通常是图像的绝对 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: 并提供一个负数的第三个参数。
有时您可能不想使用图像 URL 作为缓存键,因为 URL 的一部分是动态的(例如:用于访问控制)。SDWebImageManager 提供了一个设置缓存键过滤器的方法,该过滤器接受 NSURL 作为输入,并输出一个缓存键 NSString。
以下示例设置了一个在应用程序代理中使用的过滤器,该过滤器在将其用作缓存键之前会从 URL 中移除任何查询字符串
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
SDWebImageManager.sharedManager.cacheKeyFilter = ^(NSURL *url) {
url = [[NSURL alloc] initWithScheme:url.scheme host:url.host path:url.path];
return [url absoluteString];
};
// Your app init code...
return YES;
}
UITableView 通过单元格为第一个图像集确定图像的大小。如果您的远程图像的大小与占位符图像不同,您可能会遇到奇怪的变形缩放问题。以下文章提供了解决此问题的方法
http://www.wrichards.com/blog/2011/11/sdwebimage-fixed-width-cell-images/
默认情况下,SDWebImage 具有非常积极的缓存。它忽略 HTTP 服务器返回的所有类型缓存控制头,并以无时间限制的方式缓存返回的图像。这意味着您的图像 URL 是指向永不变更图像的静态 URL。如果指向的图像确实发生了变化,URL 的某些部分应该相应地改变。
如果您没有控制所使用的图像服务器,当其内容更新时可能无法更改URL。例如,这种情况适用于Facebook头像URL。在这种情况下,您可以使用SDWebImageRefreshCached
标志。这将略微降低性能,但会尊重HTTP缓存控制头
[imageView sd_setImageWithURL:[NSURL URLWithString:@"https://graph.facebook.com/olivier.poitrey/picture"]
placeholderImage:[UIImage imageNamed:@"avatar-placeholder.png"]
options:SDWebImageRefreshCached];
请参阅此分类: https://github.com/JJSaccolo/UIActivityIndicator-for-SDWebImage
在您的项目中使用SDWebImage有三种方式
platform :ios, '7.0'
pod 'SDWebImage', '~>3.8'
如果您正在使用Swift,请确保添加use_frameworks!
并将目标设置为iOS 8+
platform :ios, '8.0'
use_frameworks!
目前有3个子模块可供使用: Core
、MapKit
和WebP
(这意味着您可以选择安装SDWebImage的某些模块。默认情况下,您只获取Core
,因此如果您需要WebP
,则需要指定它)。
Podfile示例
pod 'SDWebImage/WebP'
github "rs/SDWebImage"
Swift
如果您使用CocoaPods安装
import SDWebImage
如果您手动安装
import WebImage
Objective-C
@import WebImage;
为了访问仓库中的所有文件,您应该克隆它。
git clone --recursive https://github.com/rs/SDWebImage.git
打开“构建设置”选项卡,在“链接”部分中,找到“其他链接器标志”设置并添加“-ObjC”标志
或者,如果这导致与扩展可选库的框架(如Parse、RestKit或opencv2)编译出现问题,而不是-ObjC标志,请使用
-force_load SDWebImage.framework/Versions/Current/SDWebImage
如果您使用Cocoa Pods并且有扩展可选库的框架(如Parsen RestKit或opencv2),而不是-ObjC标志,请使用
-force_load $(TARGET_BUILD_DIR)/libPods.a
这个
$(inherited)
在您需要使用库的源文件中导入头文件
#import <SDWebImage/UIImageView+WebCache.h>
在此阶段,您的 workspace 应该可以无错误地构建。如果您遇到问题,请发布到 Issue,社区可以帮助您解决。
所有源代码均受 MIT 许可证的许可。