本帖最后由 竹林风 于 2018-12-25 09:48 编辑
下载地址:https://github.com/SDWebImage/SDWebImage
在使用SDWebImage加载图片时,尤其是加载gif等大图时,SDWebImage会将图片缓存在内存中,这样是非常吃内存的,这时我们能要在适当的时候去释放一下SDWebImage的内存缓存,才不至于造成APP闪退。
SDWebImage提供了UIImageView、UIButton、MKAnnotationView的图片下载分类,只要一行代码就可以实现图片异步下载和缓存功能。
SDWebImage的使用
1.UITableView中使用UIImageView+WebCache
[Objective-C] 纯文本查看 复制代码 [cell.imageView sd_setImageWithURL:[NSURL URLWithString:@"http://www.domain.com/path/to/image.jpg"] placeholderImage:[UIImage imageNamed:@"placeholder.png"]];
2.使用回调blocks
在block中得到图片下载进度和图片加载完成(下载完成或者读取缓存)的回调,如果你在图片加载完成前取消了请求操作,就不会收到成功或失败的回调
[Objective-C] 纯文本查看 复制代码 [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 ...
}];
3.SDWebImageManager的使用
UIImageView(WebCache)分类的核心在于SDWebImageManager的下载和缓存处理,SDWebImageManager将图片下载和图片缓存组合起来了。SDWebImageManager也可以单独使用。
[Objective-C] 纯文本查看 复制代码 SDWebImageManager *manager = [SDWebImageManager sharedManager];
[manager loadImageWithURL: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
}
}];
4.单独使用SDWebImageDownloader异步下载图片
我们还可以单独使用SDWebImageDownloader来下载图片,但是图片内容不会缓存。
[Objective-C] 纯文本查看 复制代码 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
}
}];
5.单独使用SDImageCache异步缓存图片
SDImageCache支持内存缓存和异步的磁盘缓存(可选),如果你想单独使用SDImageCache来缓存数据的话,可以使用单例,也可以创建一个有独立命名空间的SDImageCache实例。
添加缓存的方法:
[Objective-C] 纯文本查看 复制代码 [[SDImageCache sharedImageCache] storeImage:myImage forKey:myCacheKey];
默认情况下,图片数据会同时缓存到内存和磁盘中,如果你想只要内存缓存的话,可以使用下面的方法:
[Objective-C] 纯文本查看 复制代码 [[SDImageCache sharedImageCache] storeImage:myImage forKey:myCacheKey toDisk:NO];
读取缓存时可以使用queryDiskCacheForKey:done:方法,图片缓存的key是唯一的,通常就是图片的absolute URL。
[Objective-C] 纯文本查看 复制代码 SDImageCache *imageCache = [[SDImageCache alloc] initWithNamespace:@"myNamespace"];
[imageCache queryDiskCacheForKey:myCacheKey done:^(UIImage *image) {
// image is not nil if image was found
}];
6.自定义缓存 key
有时候,一张图片的URL中的一部分可能是动态变化的(比如获取权限上的限制),所以我们只需要把URL中不变的部分作为缓存用的key。
[Objective-C] 纯文本查看 复制代码 SDWebImageManager.sharedManager.cacheKeyFilter = ^(NSURL *url) {
url = [[NSURL alloc] initWithScheme:url.scheme host:url.host path:url.path];
return [url absoluteString];
};
|