官方接口文档地址:http://cocoadocs.org/docsets/SDWebImage/3.8.1/
SDWebImage 提供了一个支持网络下载图片的UIImageView的分类,主要有以下功能:
- 为Cocoa Touch框架提供一个UIImageView的分类,加载图片并进行缓存处理。
- 异步图像下载
- 异步存储器+具备自动缓存过期处理的磁盘映像缓存
- 支持GIF播放
- 支持WebP格式
- 背景图像解压缩
- 保证同一个url图片资源不被多次下载
- 保证错误url不被反复尝试下载
- 保证不会阻塞主线程
- 高性能
- 使用GCD和ARC
- 支持Arm64架构
SDWebImage主要的类和类别:
- SDWebImageManager :管理图片下载和缓存;
- SDWebImageDownloader :负责图片的下载:
- SDImageCache:负责图片缓存;
- UIButton+WebCache :设置UIButton的图片
- UIImageView+WebCache:设置UIImageView的图片;
- NSData+ImageContentType:获取图片的类型,image/jpeg或者 image/gif
UIImageView+WebCache 基本使用
//导入头文件:#import "UIImageView+WebCache.h"
/**
* 以下方法中,程序会异步下载图片,并自动缓存到内存和本地;
*/
/**
* 方法1:sd_setImageWithURL:url placeholderImage:image
* url: 图片地址
* image:图片没有下载时显示的占位图片
*/
[self.imageView sd_setImageWithURL:url placeholderImage:image];
/**
* 方法2:带下载进度和结束处理的block
* url: 图片地址
* image:图片没有下载时显示的占位图片
* options:图片下选项
* progress:可以在这设置图片下载进度的显示, receivedSize:已接收大小;expectedSize:图片总大小;
* completed:图片下载完成的处理,image:下载的图片;error:错误码;
* cacheType:缓存的类型
SDImageCacheTypeNone:没有使用缓存,图片是直接下载的
SDImageCacheTypeDisk:磁盘缓存
SDImageCacheTypeMemory:内存缓存
缓存处理:内存缓存+磁盘缓存
* imageURL:图片的url
*/
[self.imageView sd_setImageWithURL:url placeholderImage:image options:SDWebImageLowPriority progress:^(NSInteger receivedSize, NSInteger expectedSize) {
//设置进度条
[self.progressView setProgress:(1.0 * receivedSize / expectedSize)];
} completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL) {
}];
//取消当前图片下载
- (void)sd_cancelCurrentImageLoad
- (void)sd_cancelCurrentAnimationImagesLoad
//获取当前图片URL
- (NSURL *)sd_imageURL
//下载一组图片,并且以动画的形式展现
- (void)sd_setAnimationImagesWithURLs:(NSArray *)arrayOfURLs
//是否显示等待菊花
- (void)setShowActivityIndicatorView:(BOOL)show
//菊花的类型
- (void)setIndicatorStyle:(UIActivityIndicatorViewStyle)style
SDWebImageManager
DWebImageManager负责图片的缓存和下载,其他分类下载图片也是调用的这个类;
//头文件: "SDWebImageManager.h"
//属性:
@property (weak, nonatomic) id <SDWebImageManagerDelegate> delegate; //代理
@property (strong, nonatomic, readonly) SDImageCache *imageCache; //图片缓存管理
@property (strong, nonatomic, readonly) SDWebImageDownloader *imageDownloader; //图片下载
@property (nonatomic, copy) SDWebImageCacheKeyFilterBlock cacheKeyFilter; //将图片的URL变成缓存图片的关键字
[[SDWebImageManager sharedManager] setCacheKeyFilter:^(NSURL *url) { url = [[NSURL alloc] initWithScheme:url.scheme host:url.host path:url.path]; return [url absoluteString]; }];
//方法:
// + (SDWebImageManager *)sharedManager; //单例方法
SDWebImageManager *mamager = [SDWebImageManager sharedManager];
//2、执行下载,具体参数和上面的函数一致;
[mamager downloadImageWithURL:url options:SDWebImageLowPriority progress:^(NSInteger receivedSize, NSInteger expectedSize) {
} completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, BOOL finished, NSURL *imageURL) {
}];
//根据URL返回缓存图片的键值
- (NSString *)cacheKeyForURL:(NSURL *)url
//判断图片是否已经被缓存
- (BOOL)cachedImageExistsForURL:(NSURL *)url
//异步检查图片是否已经缓存,completionBlock通常在主线程中执行
- (void)cachedImageExistsForURL:(NSURL *)url completion:(SDWebImageCheckCacheCompletionBlock)completionBlock
//根据URL缓存图片
- (void)saveImageToCache:(UIImage *)image forURL:(NSURL *)url;
//取消所有当前操作
- (void)cancelAll
//检查是否已经缓存在本地
- (BOOL)diskImageExistsForURL:(NSURL *)url
//异步检查图片是否已经缓存在本地
- (void)diskImageExistsForURL:(NSURL *)url completion:(SDWebImageCheckCacheCompletionBlock)completionBlock
//是否有操作在运行
- (BOOL)isRunning
SDWebImageManagerDelegate
//返回YES:当图片不存在于缓存中时,根据图片URL下载图片;
//返回NO:当图片不存在于缓存中时,不下载图片;
- (BOOL)imageManager:(SDWebImageManager *)imageManager shouldDownloadImageForURL:(NSURL *)imageURL
// 图片下载之后,立即进行转换,然后再存入缓存中。注:必须在全局队列中执行;
// - (UIImage *)imageManager:(SDWebImageManager *)imageManager transformDownloadedImage:(UIImage *)image withURL:(NSURL *)imageURL
SDImageCache
SDImageCache维护内存管理和可选的磁盘管理;写磁盘缓存操作是异步执行的,不会影响UI;
属性:
//图片在内存中保存的最大时间,单位:秒
@property (assign, nonatomic) NSInteger maxCacheAge
//在内存中能够存储图片的最大容量,单位:字节
@property (assign, nonatomic) NSUInteger maxCacheSize
//保存在存储器中像素的总和
@property (assign, nonatomic) NSUInteger maxMemoryCost
//内存中能缓存对象的最大个数
@property (assign, nonatomic) NSUInteger maxMemoryCountLimit
//是否使用内存缓存,默认是YES
@property (assign, nonatomic) BOOL shouldCacheImagesInMemory
//将下载的图片解压并且缓存可以提高性能,同时也会消耗一些内存。默认是YES.
//如果有内存消耗导致崩溃的现象,设成NO;
@property (assign, nonatomic) BOOL shouldDecompressImages
//禁止云备份,默认是YES;
@property (assign, nonatomic) BOOL shouldDisableiCloud
类方法:
+ (SDImageCache *)sharedImageCache
实例方法:
//添加只读的缓存路径查找SDImageCache预先缓存的图片。如果你想在APP绑定预加载图片,这个函数会有帮助;
- (void)addReadOnlyCachePath:(NSString *)path
//通过键值获取缓存路径,
//path:缓存路径的根目录
- (NSString *)cachePathForKey:(NSString *)key inPath:(NSString *)path
Discussion
//异步计算磁盘缓存的大小
- (void)calculateSizeWithCompletionBlock:(SDWebImageCalculateSizeBlock)completionBlock
Discussion
//清理所有!!过期的 !!磁盘缓存
- (void)cleanDisk
//清理所有!!过期的 !!磁盘缓存,block为空时,函数会立刻返回,
- (void)cleanDiskWithCompletionBlock:(SDWebImageNoParamsBlock)completionBlock
//清理所有磁盘缓存图片,不分过期不过期;
- (void)clearDisk
//清理所有磁盘缓存图片,不分过期不过期;block为空时,函数会立刻返回,
- (void)clearDiskOnCompletion:(SDWebImageNoParamsBlock)completion
Discussion
//清理所有内存缓存
- (void)clearMemory
//获取制定键值默认的缓存路径
- (NSString *)defaultCachePathForKey:(NSString *)key
//检查图片是否已经缓存在磁盘上;
- (BOOL)diskImageExistsWithKey:(NSString *)key
//异步检查图片是否已经缓存在磁盘上, completion block必须在主队列执行;
- (void)diskImageExistsWithKey:(NSString *)key completion:(SDWebImageCheckCacheCompletionBlock)completionBlock
//获取磁盘缓存的图片的数量
- (NSUInteger)getDiskCount
//获取用作磁盘缓存的大小
- (NSUInteger)getSize
//根据键值查找图片,先在内存缓存中找,然后再磁盘中找
- (UIImage *)imageFromDiskCacheForKey:(NSString *)key
Query the disk cache synchronously after checking the memory cache.
//在内存缓存中查找图片
- (UIImage *)imageFromMemoryCacheForKey:(NSString *)key
//根据命名空间初始化一个新的缓存存储空间,
- (id)initWithNamespace:(NSString *)ns
//根据命名空间和缓存路径初始化一个新的缓存存储空间,
- (id)initWithNamespace:(NSString *)ns diskCacheDirectory:(NSString *)directory
//根据路径创建磁盘缓存目录
- (NSString *)makeDiskCachePath:(NSString *)fullNamespace
//异步查询磁盘缓存
- (NSOperation *)queryDiskCacheForKey:(NSString *)key done:(SDWebImageQueryCompletedBlock)doneBlock
//移除内存和磁盘中键值对应的图片
- (void)removeImageForKey:(NSString *)key
//异步删除内存和磁盘中的图片,磁盘删除是可选的;
- (void)removeImageForKey:(NSString *)key fromDisk:(BOOL)fromDisk
//异步删除内存和磁盘中的图片,磁盘删除是可选的,带completion block
- (void)removeImageForKey:(NSString *)key fromDisk:(BOOL)fromDisk withCompletion:(SDWebImageNoParamsBlock)completion
//异步删除内存和磁盘中的图片,带completion block
- (void)removeImageForKey:(NSString *)key withCompletion:(SDWebImageNoParamsBlock)completion
//根据键值将图片存储在内存和磁盘中;
- (void)storeImage:(UIImage *)image forKey:(NSString *)key
//根据键值将图片存储在内存和磁盘中,磁盘存储是可选的;
- (void)storeImage:(UIImage *)image forKey:(NSString *)key toDisk:(BOOL)toDisk
//根据键值将图片存储在内存和磁盘中,磁盘存储是可选的;
//recalculate:直接使用imageData还是从image中获取;
//imageData:服务器返回的数据,将会用作磁盘存储;为了节约性能和CPU,通常不会将image转换成可存储、压缩过的图片格式;
- (void)storeImage:(UIImage *)image recalculateFromImage:(BOOL)recalculate imageData:(NSData *)imageData forKey:(NSString *)key toDisk:(BOOL)toDisk
//缓存图片数据到本地磁盘
- (void)storeImageDataToDisk:(NSData *)imageData forKey:(NSString *)key
SDWebImageDownloader
//属性
// 当前需要下载的数量
@property (readonly, nonatomic) NSUInteger currentDownloadCount
//下载超时时间,默认15S
@property (assign, nonatomic) NSTimeInterval downloadTimeout
//下载队列操作顺序,默认是SDWebImageDownloaderFIFOExecutionOrder
@property (assign, nonatomic) SDWebImageDownloaderExecutionOrder executionOrder
//获取下载图片的HTTP请求的请求头;
@property (nonatomic, copy) SDWebImageDownloaderHeadersFilterBlock headersFilter
//最大并发下载数;
@property (assign, nonatomic) NSInteger maxConcurrentDownloads
//密码
@property (strong, nonatomic) NSString *password
//对下载的图片压缩并缓存可以提高性能,同时也会消耗内存。默认是YES;
//如果内存消耗过多引起崩溃,设成NO;
@property (assign, nonatomic) BOOL shouldDecompressImages
//URL请求的证书
@property (strong, nonatomic) NSURLCredential *urlCredential
//用户名
@property (strong, nonatomic) NSString *username
//类方法
+ (SDWebImageDownloader *)sharedDownloader
Discussion
//实例方法
//取消队列中所有下载操作
- (void)cancelAllDownloads
//根据URL创建异步下载
- (id<SDWebImageOperation>)downloadImageWithURL:(NSURL *)url options:(SDWebImageDownloaderOptions)options progress:(SDWebImageDownloaderProgressBlock)progressBlock completed:(SDWebImageDownloaderCompletedBlock)completedBlock
Discussion
//创建下载队列
- (void)setOperationClass:(Class)operationClass
Sets a subclass of SDWebImageDownloaderOperation as the default NSOperation to be used each time SDWebImage constructs a request operation to download an image.
//暂停下载
- (void)setSuspended:(BOOL)suspended
Discussion
//为每一个http请求添加http请求头
- (void)setValue:(NSString *)value forHTTPHeaderField:(NSString *)field
//http请求头数据
- (NSString *)valueForHTTPHeaderField:(NSString *)field