本库为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 ...
}];
注意:如果您在完成之前取消了图片请求,则成功和失败block均不会被调用。
SDWebImageManager是UIImageView+WebCache分类背后的类。它将异步下载器与图像缓存存储器相连接。您可以直接使用此类,在其他上下文中(例如Cocoa)受益于具有缓存的Web图片下载。
以下是使用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"标志
或者,如果您使用 Cocoa Pods 并且有任何扩展可选库的框架,例如 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 许可证授权。