文章目录
  1. 1. 方法实现
  2. 2. 使用缓存类

这个类只有三个类方法+ (void) resetCache+ (void) setObject:(NSData *)data forKey:(NSString *)key+ (id) objectForKey:(NSString *)key
resetCache:清空当前的缓存
setObject:(NSData *)data forKey:(NSString *)key:根据Key保存data到缓存中
objectForKey:(NSString *)key:根据Key从缓存中获取data

方法实现

首先我们需要实现一个方法,该方法用于返回缓存的完整目录
核心的代码为NSArray* paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);用于获取沙盒内的缓存目录

1
2
3
4
5
6
7
+ (NSString *) cacheDirectory {
NSArray* paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);
NSString* cacheDirectory = [paths objectAtIndex:0];
// 添加目录后缀
cacheDirectory = [cacheDirectory stringByAppendingPathComponent:@"ZTCaches"];
return cacheDirectory;
}

清空缓存也相对容易,只要把该目录的文件删除即可

1
2
3
+ (void) resetCache {
[[NSFileManager defaultManager] removeItemAtPath:[ZTCache cacheDirectory] error:nil];
}

根据Key将data存入缓存

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
+ (void) setObject:(NSData *)data forKey:(NSString *)key{
NSFileManager *fileManager = [NSFileManager defaultManager];
NSString *filename = [self.cacheDirectory stringByAppendingPathComponent:key];
BOOL isDir = YES;
// 如果缓存目录不存在需要创建缓存目录
if (![fileManager fileExistsAtPath:self.cacheDirectory isDirectory:&isDir]) {
// 创建目录
[fileManager createDirectoryAtPath:self.cacheDirectory withIntermediateDirectories:NO attributes:nil error:nil];
}
NSError *error;
@try {
[data writeToFile:filename options:NSDataWritingAtomic error:&error];
}
@catch (NSException *exception) {
//
}
}

根据Key从缓存中获取data

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
+ (NSData *) objectForKey:(NSString *)key{
NSFileManager* fileManager = [NSFileManager defaultManager];
// 根据目录和Key创建一个完整的fileName
NSString* filename = [self.cacheDirectory stringByAppendingPathComponent:key];
// 判断文件是否存在
if ([fileManager fileExistsAtPath:filename]) {
// 获取文件属性Dic,并取其中的最后修改时间属性
NSDate *modificationDate = [[fileManager attributesOfItemAtPath:filename error:nil] objectForKey:NSFileModificationDate];
// 如果最后修改时间与现在时间大于7天,删除文件
if ([modificationDate timeIntervalSinceNow] > cacheTime) {
[fileManager removeItemAtPath:filename error:nil];
}else{
// 从文件中读取data
NSData *data = [NSData dataWithContentsOfFile:filename];
return data;
}
}
return nil;
}

使用缓存类

根据实际需要,调用获取缓存,URL用MD5进行加工变为短连接

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
- (void) loadImageFromURL:(NSString*)URL {
NSURL *imageURL = [NSURL URLWithString:URL];
NSString *key = [URL MD5Hash];
NSData *data = [ZTCache objectForKey:key];
// 如果存在将data传入imageView,否则添加一个异步任务
if (data) {
UIImage *image = [UIImage imageWithData:data];
_imageView.image = image;
} else {
_imageView.image = [UIImage imageNamed:@"img_def"];
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0ul);
dispatch_async(queue, ^{
NSData *data = [NSData dataWithContentsOfURL:imageURL];
[ZTCache setObject:data forKey:key];
UIImage *image = [UIImage imageWithData:data];
dispatch_sync(dispatch_get_main_queue(), ^{
_imageView.image = image;
});
});
}
}

String+MD5实现如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
- (NSString *) MD5Hash {

CC_MD5_CTX md5;
CC_MD5_Init (&md5);
CC_MD5_Update (&md5, [self UTF8String], (CC_LONG)[self length]);

unsigned char digest[CC_MD5_DIGEST_LENGTH];
CC_MD5_Final (digest, &md5);
NSString *s = [NSString stringWithFormat: @"%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x",
digest[0], digest[1],
digest[2], digest[3],
digest[4], digest[5],
digest[6], digest[7],
digest[8], digest[9],
digest[10], digest[11],
digest[12], digest[13],
digest[14], digest[15]];

return s;

}

示例

文章目录
  1. 1. 方法实现
  2. 2. 使用缓存类