一、SDWebImage框架结构
1、收到内存警告时清除缓存
-(void)applicationDidReceiveMemoryWarning:(UIApplication *)application
{
//接收到内存警告的时候调用该方法
//01 清除内存缓存
[[SDWebImageManager sharedManager].imageCache clearMemory];
//02 取消队列中的下载任务
[[SDWebImageManager sharedManager] cancelAll];
//清除磁盘缓存
[[SDWebImageManager sharedManager].imageCache clearDiskOnCompletion:nil];
//补充细节
//001 磁盘缓存路径:~/Library/Caches/default/com.hackemist.SDWebImageCache.default/
//002 9ccb7f34d0c62d5c11ed2774df5c5dc7 本身对URL进行MD5加密处理,使用密文来作为文件的名称保存
//echo -n "http://exp.cdn-hotels.com/hotels/4000000/3900000/3893200/3893187/3893187_25_y.jpg" | md5
//003 下载:
//SDWebImageDownloaderFIFOExecutionOrder :默认以先进先出的方式来处理
//SDWebImageDownloaderLIFOExecutionOrder :通过设置依赖的方式来设置优先级addDependency
//downloadQueue.maxConcurrentOperationCount = 6 最大并发数量
//004 缓存处理:
//二级缓存结构:内存缓存-磁盘缓存
//内存缓存如何实现? NSMUtableDictionary(多图下载程序)- SDWeb(NSCache)
//005 清理磁盘缓存
//[[SDWebImageManager sharedManager].imageCache clearDiskOnCompletion:nil];
//clear(clearDiskOnCompletion) 直接删除缓存文件,重新创建新的文件夹
//clean(deleteOldFiles) 首先先删除过期的文件,累加计算剩余文件的总大小,和设置的总大小进行比较,如果超出,那么就继续删除(按照文件的日期来删除)
//006 获得缓存文件的总大小 getSize
//007 缓存时间(过期时间) kDefaultCacheMaxCacheAge 1星期
//NSCache
}
终端加密:
输入echo -n "需要加密的内容" | md5
回车得到加密后的字符串
2、NSCache
#import "ViewController.h"
@interface ViewController ()<NSCacheDelegate>
@property (nonatomic, strong) NSCache *cache;
@end
@implementation ViewController
-(NSCache *)cache
{
if (_cache == nil) {
_cache = [[NSCache alloc]init];
//设置最大缓存数据的数量,如果超出该限制那么内部会自动开启一个回收过程把最先存储的数据删除
//_cache.countLimit = 8;
//设置最大的缓存成本(量) 成本:单位概念
//image.size.height * image.size.width * image.scale * image.scale SD框架中图片的成本计算
_cache.totalCostLimit = 8;
//设置代理
_cache.delegate = self;
}
return _cache;
}
//保存数据
- (IBAction)saveBtnClick:(id)sender {
//存数据
for (int i = 0; i < 10; ++i) {
NSData *data = [NSData dataWithContentsOfFile:@"/Users/xiaomage/Desktop/Snip20161121_67.png"];
//[self.cache setObject:data forKey:@(i)];
//设置缓存的单位成本 缓存的大小
[self.cache setObject:data forKey:@(i) cost:1];
NSLog(@"存数据---%zd",i);
}
NSLog(@"____________________");
}
//取数据
- (IBAction)checkBtnClick:(id)sender {
//取数据
for (int i = 0; i < 10; ++i) {
NSData *data = [self.cache objectForKey:@(i)];
//校验是否有该数据
if (data) {
NSLog(@"取数据---%zd",i);
}
}
}
#pragma mark -----------------------
#pragma mark NSCacheDelegate
-(void)cache:(NSCache *)cache willEvictObject:(id)obj
{
//内部开启回收过程的时候调用
NSLog(@"--------内部开启回收过程");
}
@end