SDWebImage的简单使用

转载:https://www.cnblogs.com/xjy-123/p/5205339.html

首先,SDWebImage的git地址是:https://github.com/rs/SDWebImage。我们可以直接到这里进行下载,然后添加到自己的项目中去。

一、使用场景(前提是已经导入了SDWebImage这个库)

1、场景一、加载图片

    使用SDWebImage可以去加载远程图片,而且还会缓存图片,下次请求会看一下是否已经存在于缓存中,如果是的话直接取本地缓存,如果不是的话则重新请求。使用方法很简单,在需要使用该场景的类中导入

//导入头文件

#import "UIImageView+WebCache.h"

然后调用:

- (void)sd_setImageWithPreviousCachedImageWithURL:(NSURL *)url andPlaceholderImage:(UIImage *)placeholder options:(SDWebImageOptions)options progress:(SDWebImageDownloaderProgressBlock)progressBlock completed:(SDWebImageCompletionBlock)completedBlock;

提示:我们还可以在UIImageView+WebCache.h中看到其他的方法,和上边的方法类似,读者自行查看即可。

//包含了多种功能

1,sd_setImageWithURL获取网络图片

2,placeholderImage占位图片

3,progress 下载进度 用法: NSLog(@"下载进步:%f",(double)receivedSize / expectedSize);

4, *image *error *imageURL分别完成后返回的图片,错误和下载地址

5,SDImageCacheType cacheType 是枚举类型,图片存储位置在内存、磁盘或无

6,SDWebImageOptions 枚举类型

    用法:SDWebImageOptions options = SDWebImageRetryFailed | SDWebImageLowPriority

    SDWebImageRetryFailed 下载失败重复下载        常用

    SDWebImageLowPriority 当UI交互的时候暂停下载  常用

    SDWebImageCacheMemoryOnly 只存图片在内存

    SDWebImageProgressiveDownload 可以像浏览器那样从上往下下载刷新图片

    SDWebImageRefreshCached 刷新缓存

    SDWebImageHighPriority  高优先级

    SDWebImageDelayPlaceholder 不加载占位图   

//示例tableview的cell:

    [cell.imageView sd_setImageWithURL:(NSURL *)placeholderImage:(UIImage *)options:(SDWebImageOptions)progress:^(NSInteger receivedSize, NSInteger expectedSize) {

        //'receivedSize'已经接收了多少数据大小

//'expectedSize'服务器上文件大小

} completed:^(UIImage *image,NSError *error,SDImageCacheType cacheType,NSURL *imageURL) {

// 'image'下载完成后自动转成的image图片

// 'error'返回错误

// 'cacheType'缓存类型

// 'imageURL'

}];

场景二、使用它做本地缓存

  很多时候我们可能拍照得到的一张图片要多个地方使用,那么我们就希望可以把这张图片放到缓存里面,然后每次用这张图片的时候就去通过特定的方式取即可。SDWebImage就有这样的一个类:SDImageCache。该类完美地帮助了我们解决了这个问题。

  使用的时候,我们首先要在使用的类里面做导入:

#import "SDImageCache.h"

然后就可以进行相关的操作了。让我们直接看看SDImageCache.h文件:

@property (assign, nonatomic) NSUInteger maxMemoryCost;

/**

* The maximum length of time to keep an image in the cache, in seconds

*/

@property (assign, nonatomic) NSInteger maxCacheAge;

/**

* The maximum size of the cache, in bytes.

*/

@property (assign, nonatomic) NSUInteger maxCacheSize;

/**

* Returns global shared cache instance

*

* @return SDImageCache global instance

*/

+ (SDImageCache *)sharedImageCache;

/**

* Init a new cache store with a specific namespace

*

* @param ns The namespace to use for this cache store

*/

- (id)initWithNamespace:(NSString *)ns;

/**

* Add a read-only cache path to search for images pre-cached by SDImageCache

* Useful if you want to bundle pre-loaded images with your app

*

* @param path The path to use for this read-only cache path

*/

- (void)addReadOnlyCachePath:(NSString *)path;

/**

* Store an image into memory and disk cache at the given key.

*

* @param image The image to store

* @param key  The unique image cache key, usually it's image absolute URL

*/

- (void)storeImage:(UIImage *)image forKey:(NSString *)key;

/**

* Store an image into memory and optionally disk cache at the given key.

*

* @param image  The image to store

* @param key    The unique image cache key, usually it's image absolute URL

* @param toDisk Store the image to disk cache if YES

*/

- (void)storeImage:(UIImage *)image forKey:(NSString *)key toDisk:(BOOL)toDisk;

/**

* Store an image into memory and optionally disk cache at the given key.

*

* @param image      The image to store

* @param recalculate BOOL indicates if imageData can be used or a new data should be constructed from the UIImage

* @param imageData  The image data as returned by the server, this representation will be used for disk storage

*                    instead of converting the given image object into a storable/compressed image format in order

*                    to save quality and CPU

* @param key        The unique image cache key, usually it's image absolute URL

* @param toDisk      Store the image to disk cache if YES

*/

- (void)storeImage:(UIImage *)image recalculateFromImage:(BOOL)recalculate imageData:(NSData *)imageData forKey:(NSString *)key toDisk:(BOOL)toDisk;

/**

* Query the disk cache asynchronously.

*

* @param key The unique key used to store the wanted image

*/

- (NSOperation *)queryDiskCacheForKey:(NSString *)key done:(SDWebImageQueryCompletedBlock)doneBlock;

/**

* Query the memory cache synchronously.

*

* @param key The unique key used to store the wanted image

*/

- (UIImage *)imageFromMemoryCacheForKey:(NSString *)key;

/**

* Query the disk cache synchronously after checking the memory cache.

*

* @param key The unique key used to store the wanted image

*/

- (UIImage *)imageFromDiskCacheForKey:(NSString *)key;

/**

* Remove the image from memory and disk cache synchronously

*

* @param key The unique image cache key

*/

- (void)removeImageForKey:(NSString *)key;

/**

* Remove the image from memory and disk cache synchronously

*

* @param key            The unique image cache key

* @param completionBlock An block that should be executed after the image has been removed (optional)

*/

- (void)removeImageForKey:(NSString *)key withCompletition:(void (^)())completion;

/**

* Remove the image from memory and optionally disk cache synchronously

*

* @param key      The unique image cache key

* @param fromDisk Also remove cache entry from disk if YES

*/

- (void)removeImageForKey:(NSString *)key fromDisk:(BOOL)fromDisk;

/**

* Remove the image from memory and optionally disk cache synchronously

*

* @param key            The unique image cache key

* @param fromDisk        Also remove cache entry from disk if YES

* @param completionBlock An block that should be executed after the image has been removed (optional)

*/

- (void)removeImageForKey:(NSString *)key fromDisk:(BOOL)fromDisk withCompletition:(void (^)())completion;

/**

* Clear all memory cached images

*/

- (void)clearMemory;

/**

* Clear all disk cached images. Non-blocking method - returns immediately.

* @param completionBlock An block that should be executed after cache expiration completes (optional)

*/

- (void)clearDiskOnCompletion:(void (^)())completion;

/**

* Clear all disk cached images

* @see clearDiskOnCompletion:

*/

- (void)clearDisk;

/**

* Remove all expired cached image from disk. Non-blocking method - returns immediately.

* @param completionBlock An block that should be executed after cache expiration completes (optional)

*/

- (void)cleanDiskWithCompletionBlock:(void (^)())completionBlock;

/**

* Remove all expired cached image from disk

* @see cleanDiskWithCompletionBlock:

*/

- (void)cleanDisk;

/**

* Get the size used by the disk cache

*/

- (NSUInteger)getSize;

/**

* Get the number of images in the disk cache

*/

- (NSUInteger)getDiskCount;

/**

* Asynchronously calculate the disk cache's size.

*/

- (void)calculateSizeWithCompletionBlock:(void (^)(NSUInteger fileCount, NSUInteger totalSize))completionBlock;

/**

* Check if image exists in cache already

*/

- (BOOL)diskImageExistsWithKey:(NSString *)key;

/**

*  Get the cache path for a certain key (needs the cache path root folder)

*

*  @param key  the key (can be obtained from url using cacheKeyForURL)

*  @param path the cach path root folder

*

*  @return the cache path

*/

- (NSString *)cachePathForKey:(NSString *)key inPath:(NSString *)path;

/**

*  Get the default cache path for a certain key

*

*  @param key the key (can be obtained from url using cacheKeyForURL)

*

*  @return the default cache path

*/

- (NSString *)defaultCachePathForKey:(NSString *)key;


存图:

SDImageCache *imageCache = [SDImageCache sharedImageCache];

  [imageCache storeImage:image forKey:@"myphoto"toDisk:YES];

取图:

SDImageCache *imageCache = [SDImageCache sharedImageCache];

    UIImage *image = [imageCache imageFromDiskCacheForKey:@"myphoto"];

// 这样就可以取到自己存的图片了。可以看一下SDImageCache.h这个类了,里面提供了存图片到内存和磁盘的方法,还有取图片的方法,以及判断该图片是否存在的方法。还有就是删除图片、清空磁盘缓存、得到缓存大小等方法。

场景二、做设置中的清除缓存功能

简单来说,当我们点击清除缓存按钮的时候会触发的消息如下:

- (void)clearCaches

{

      //使用了'MBProgressHUD'提示框框架

[MBProgressHUD showMessage:@"正在清理.."]; 

[[SDImageCache sharedImageCache] clearMemory]; 

[[SDImageCache sharedImageCache] clearDisk]; 

[self performSelectorOnMainThread:@selector(cleanCacheSuccess) withObject:nil waitUntilDone:YES];

}

- (void)cleanCacheSuccess

12 {

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)2 * NSEC_PER_SEC), dispatch_get_main_queue(), ^{

self.cacheLab.text = @"0.00M";

return;

20  });

}

实现原理:

//其实SDWebImage之所以能够实现缓存的原理关键就是在哪个key值。

  //比如我们在使用的时候,其实就是把url当做了一个图片的key值,然后存储对应的图片,如果下次请求的url和这次请求的url一样,那么就直接根据url(这个key)来取图片,如果url作为key的图片缓存不存在,就去请求远程服务器,然后请求过来之后再次将url和图片对应,然后存储。

- (void)sd_setImageWithPreviousCachedImageWithURL:(NSURL *)url andPlaceholderImage:(UIImage *)placeholder options:(SDWebImageOptions)options progress:(SDWebImageDownloaderProgressBlock)progressBlock completed:(SDWebImageCompletionBlock)completedBlock;

五、其他

- (void)applicationDidReceiveMemoryWarning:(UIApplication *)application

{

    SDWebImageManager *mrg = [SDWebImageManager sharedManager];

    //1,取消下载操作

    [mrg cancelAll];

    //2,清除内存缓存

    [mrg.imageCache clearMemory];

}


3其他功能

1,设置定期清理缓存时间   

//设置100天,默认是7天

[SDWebImageManager sharedManager].imageCache.maxCacheAge = 100 * 24 * 60 * 60

2,设置最大缓存容量

//无默认值,单位目前不清楚

[SDWebImageManager sharedManager].imageCache.maxCacheSize = ;

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,772评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,458评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,610评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,640评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,657评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,590评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,962评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,631评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,870评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,611评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,704评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,386评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,969评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,944评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,179评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,742评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,440评论 2 342

推荐阅读更多精彩内容