.
SDWebImage
-
|--SDWebImageCompat :一些兼容性相关的宏定义
|--SDWebImageOperation :只有一个 cancel 方法的 protocal
|
|--Downloader :下载模块
| |-- SDWebImageDownloader
| |-- SDWebImageDownloaderOperation
|
|--Cache :内存和硬盘缓存模块
| |-- SDImageCache
|
|--Utils :
| |-- SDWebImageManager 将缓存和下载模块结合起来使用
| |-- SDWebImagePrefetcher 预下载图片
| |-- SDWebImageDecoder
|
|--Categories : UIKit 相关的Category,方便使用,还支持 MKAnnotationView
|-- MKAnnotationView+WebCache
|-- UIButton+WebCache
|-- UIImageView+WebCache
-
... ...
导入头文件<SDWebImage/UIImageView+WebCache.h>
调用sd_setImageWithURL:placeholderImage:即可,缓存异步下载等默认都无需配置
- (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];
}
[cell.imageView sd_setImageWithURL:[NSURL URLWithString:@"http://www.domain.com/path/to/image.jpg"]
placeholderImage:[UIImage imageNamed:@"placeholder.png"]];
return cell;
}
[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) {
自定义操作
}];
UIButton+WebCache
- (void)sd_setBackgroundImageWithURL:(NSURL *)url forState:(UIControlState)state placeholderImage:(UIImage *)placeholder options:(SDWebImageOptions)options completed:(SDWebImageCompletionBlock)completedBlock
UIImage+GIF
+ (UIImage *)sd_animatedGIFWithData:(NSData *)data
设置
[SDWebImageManager sharedManager].imageDownloader.username = @"username";
[SDWebImageManager sharedManager].imageDownloader.password = @"pwd";
或者
[SDWebImageManager sharedManager].imageDownloader.urlCredential = myUrlCredential;
其中之一
[SDWebImageManager.sharedManager.imageDownloader setValue:@"SDWebImage Demo" forHTTPHeaderField:@"AppName"]; //自定义头
SDWebImageManager.sharedManager.imageDownloader.executionOrder = SDWebImageDownloaderLIFOExecutionOrder; //下载任务的执行顺序 FIFO LIFO 执行顺序 ,后面会说到
maxConcurrentDownloads //最多同时下载的图片数量
downloadTimeout //下载超时 还可以设置失败后的操作 失败重试等
options:(SDWebImageOptions) //我们在调用下载图片的方法时,有可选的options参数 ,第二篇文章会说到
下面的属性方法都以 [[SDWebImageManager.sharedManager.imageCache] xxx] 形式调用
NSUInteger maxMemoryCost //缓存最多能占用多少内存,默认是无限大~,
NSUInteger maxMemoryCountLimit //最多能缓存多少张图片
NSInteger maxCacheAge //最大缓存时间 默认一周
NSUInteger maxCacheSize //最大磁盘缓存空间
- (NSUInteger)getSize; //同步获取磁盘缓存大小
- (void)calculateSizeWithCompletionBlock:(SDWebImageCalculateSizeBlock)completionBlock; //异步获取磁盘缓存大小
- (NSUInteger)getDiskCount; //异步获取磁盘缓存文件数量
- (void)cleanDisk; //cleanDisk 删除所有过期的图片
- (void)clearMemory; //清除内存缓存
//无需手动调用上面的2个方法,SDWebImageCache会监听
UIApplicationDidReceiveMemoryWarningNotification
UIApplicationWillTerminateNotification
UIApplicationDidEnterBackgroundNotification
通知来清除内存缓存和后台清理过期的磁盘缓存
但这个方法可以暴漏给用户 ,作为清除缓存的设置
[SDWebImageManager.sharedManager.imageCache clearDisk];
直接使用SDWebImageManager 下载图片,异步下载和缓存已经做好了.
SDWebImageManager *manager = [SDWebImageManager sharedManager];
[manager downloadImageWithURL:imageURL
options:0
progress:^(NSInteger receivedSize, NSInteger expectedSize) {
// 进度更新
}
completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, BOOL finished, NSURL *imageURL) {
if (image) {
// 自定义操作
}
}];
@protocol SDWebImageManagerDelegate <NSObject>
@optional
/**
* 当缓存中没有图片是是否需要下载图片
* @return 如果下载,返回 YES, 默认值 YES;
*/
- (BOOL)imageManager:(SDWebImageManager *)imageManager shouldDownloadImageForURL:(NSURL *)imageURL;
/**
* 这个方法在图片被下载之后,放入缓存之前,我们可以在这里裁剪图片,添加圆角等,之后存入缓存.
* NOTE: 这个方法在全局队列中异步后台执行,不会阻塞主线程.
*/
- (UIImage *)imageManager:(SDWebImageManager *)imageManager transformDownloadedImage:(UIImage *)image withURL:(NSURL *)imageURL;
@end
SDWebImageDownloader *downloader = [SDWebImageDownloader sharedDownloader];
[downloader downloadImageWithURL:imageURL
options:0
progress:^(NSInteger receivedSize, NSInteger expectedSize) {
// 进度更新
}
completed:^(UIImage *image, NSData *data, NSError *error, BOOL finished) {
if (image && finished) {
// 自定义操作
}
}];
存
[[SDImageCache sharedImageCache] storeImage:myImage forKey:myCacheKey];
默认会在内存和磁盘中缓存图片,如果不需要磁盘缓存可以使用 storeImage:forKey:toDisk:
取
SDImageCache *imageCache = [[SDImageCache alloc] initWithNamespace:@"myNamespace"];
[imageCache queryDiskCacheForKey:myCacheKey done:^(UIImage *image) {
// 如果缓存中存在图片,则 image!=nil
}];
默认会在内存和磁盘中查找缓存,如果不需要在磁盘中查找缓存,可以 imageFromMemoryCacheForKey:
默认情况下 缓存的key是图片的 url 经过MD5加密生成的
每张图片被保存为一个文件,文件名类似 1d067b6f4457574b8165aef42643752e
NSString *key = [[SDWebImageManager sharedManager] cacheKeyForURL:self.request.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];
};
// 其他初始化操作
return YES;
}
设置了
SDWebImageManager.sharedManager.imageDownloader.executionOrder = SDWebImageDownloaderLIFOExecutionOrder;
如果你没有使用CocoaPods下载SDWebImage,通过Github DownLoad Zip 或者Git 客户端下载运行其Demo时,会运行失败,其中解析WebP格式图片使用的是Google的库,作为 submodule 没有被下载下来.
使用 git clone --recursive https://github.com/rs/SDWebImage.git 命令下载SDWebImage 及其subModule ,最好翻墙后在运行命令,否则也可能下载不完整.