使用开源库 SDWebImage 异步下载缓存图片--载
来自:http://www.cnblogs.com/YouXianMing/p/3604851.html
source https://github.com/rs/SDWebImage
APIdoc http://hackemist.com/SDWebImage/doc
Asynchronous image downloader with cache support with an UIImageView category
UIImageView的类目,支持异步图片下载,支持缓存机制
This library provides a category for UIImageVIew with support for remote images coming from the web.
这个库给UIImageView提供类目,支持远程下载图片(从网络上)
It provides:
- An UIImageView category adding web image and cache management to the Cocoa Touch framework
- An asynchronous image downloader
- An asynchronous memory + disk image caching with automatic cache expiration handling
- Animated GIF support
- WebP format support
- A background image decompression
- A guarantee that the same URL won‘t be downloaded several times
- A guarantee that bogus URLs won‘t be retried again and again
- A guarantee that main thread will never be blocked
- Performances!
- Use GCD and ARC
- Arm64 support
- 一个UIImageView的类目,给 Cocoa Touch 框架添加了异步下载远程图片以及管理图片缓存的功能
- 一个图片的异步下载器
- 一个内存 + 磁盘的缓存机制,并自动管理
- gif动画支持
- WebP格式支持
- 后台解压图片
- 确保同样地 URL 不会重复的下载多次
- 确保无效的 URL 不会重复的链接
- 确保主线程永远不会阻塞
- 效果拔群!
- 使用GCD以及要求ARC
- 支持64位系统
以下进行SDWebImage使用的教程解说.
1. 从地址 https://github.com/rs/SDWebImage 下载源码,将源码包中得 SDWebImage 文件夹拖入你的工程当中.
2. 头文件较多,请新建一个 SDWebImage.h 的头文件,写以下代码并包含所有头文件,添加到.pch文件中
-------------------------------------------------------------------------------
//MKAnnotationView地图的注解View缓存
#import
"MKAnnotationView+WebCache.h"
//判断NSData是否什么类型的图片(例如:jpg,png,gif)
#import
"NSData+ImageContentType.h"
//是SDWebImage包的一部分
#import
"SDImageCache.h" //缓存相关
#import
"SDWebImageCompat.h" //组件相关
#import "SDWebImageDecoder.h"
//解码相关
//图片下载以及下载管理器
#import "SDWebImageDownloader.h"
#import
"SDWebImageDownloaderOperation.h"
//管理以及操作
#import
"SDWebImageManager.h"
#import
"SDWebImageOperation.h"
//UIButton类目
#import
"UIButton+WebCache.h"
//gif类目
#import
"UIImage+GIF.h"
//图片其他类目
#import "UIImage+MultiFormat.h"
#import
"UIImage+WebP.h"
#import "UIImageView+WebCache.h"
-------------------------------------------------------------------------------
3. 正式开始讲解怎么使用
独立的下载图片的功能(没有缓存机制)
NSString *oneImageURL = @"http://wallpapers.wallbase.cc/rozne/wallpaper-573934.jpg"; [[SDWebImageDownloader sharedDownloader] downloadImageWithURL:[NSURL URLWithString:oneImageURL] options:0 progress:^(NSInteger receivedSize, NSInteger expectedSize) { //此处为下载进度 } completed:^(UIImage *image, NSData *data, NSError *error, BOOL finished) { //下载完成后进入这里执行 }];
分析:此方法为单例模式,看其源码
+ (SDWebImageDownloader *)sharedDownloader
{
static dispatch_once_t
once;
static id
instance;
dispatch_once(&once,
^{
instance = [self
new];
});
return instance;
}
- (id)init {
if ((self = [super
init])) {
_executionOrder
= SDWebImageDownloaderFIFOExecutionOrder;
_downloadQueue =
[NSOperationQueue new];
_downloadQueue.maxConcurrentOperationCount =
2;
_URLCallbacks =
[NSMutableDictionary
new];
_HTTPHeaders =
[NSMutableDictionary dictionaryWithObject:@"image/webp,image/*;q=0.8"
forKey:@"Accept"];
_barrierQueue =
dispatch_queue_create("com.hackemist.SDWebImageDownloaderBarrierQueue",
DISPATCH_QUEUE_CONCURRENT);
_downloadTimeout = 15.0;
}
return self;
}
typedef NS_ENUM(NSInteger, SDWebImageDownloaderExecutionOrder)
{
/**
* Default value. All download
operations will execute in queue style (first-in-first-out).
默认值.所有的下载操作将会进入串行线程池FIFO
*/
SDWebImageDownloaderFIFOExecutionOrder,
/**
* All download operations will
execute in stack style
(last-in-first-out).
*/
SDWebImageDownloaderLIFOExecutionOrder
};
如果仅仅看上面的部分,知道下载单例由串行线程池管理着,按照队列执行,一次最多能执行两个,但我在实际测试过程中发现,并不像描述的那样子......,好吧,就当做是并发执行的了(此处疑问有时间再解决)
独立的下载图片的功能(有缓存机制)
NSString *oneImageURL = @"http://pic.cnitblog.com/avatar/607542/20140226182241.png"; [[SDWebImageManager sharedManager] downloadWithURL:[NSURL URLWithString:oneImageURL] options:0 progress:^(NSInteger receivedSize, NSInteger expectedSize) { //此处为下载进度 } completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, BOOL finished) { //下载完成后进入这里执行 }];
清除缓存文件
[[SDImageCache sharedImageCache] clearDisk];
判断本地缓存中是否存在网络中的图片
NSString *imageNetURL = @"http://pic.cnitblog.com/avatar/607542/20140226182241.png"; [[SDImageCache sharedImageCache] diskImageExistsWithKey:imageNetURL];
获取缓存图片张数
[[SDImageCache sharedImageCache] getDiskCount];
获取所有缓存图片的总大小
[[SDImageCache sharedImageCache] getSize];
直接从缓存中提取图片
NSString *imageNetURL = @"http://pic.cnitblog.com/avatar/607542/20140226182241.png"; [[SDImageCache sharedImageCache] imageFromDiskCacheForKey:imageNetURL];
直接删除缓存中得图片
NSString *imageNetURL = @"http://pic.cnitblog.com/avatar/607542/20140226182241.png"; [[SDImageCache sharedImageCache] removeImageForKey:imageNetURL];
在UITableView中使用
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { static NSString *MyIdentifier = @"Y.X."; 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 = @"Y.X."; return cell; }
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。