这个类只有三个类方法+ (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; }
|
示例