iOS 的 LRU 磁盘缓存。
NSCoding
,就可以接受任何类型的对象作为键和值。[[ISDiskCache sharedCache] setObject:object forKey:@"http://example.com"];
[[ISDiskCache sharedCache] objectForKey:@"http://example.com"];
[ISDiskCache sharedCache].limitOfSize = 10 * 1024 * 1024; // 10MB
当磁盘缓存的总体大小超过大小限制时,ISDiskCache
将自动调用 removeOldObjects
。该方法将文件按 NSFileModificationDate
排序,并从最旧的文件开始删除。每个 objectForKey:
更新 NSFileModificationDate
,因此修改日期等于访问日期。
将 ISDiskCache/ISDiskCache.{h,m}
添加到您的 Xcode 项目中。
您应该注意,ISDiskCache
是同步工作的。如果在主线程上调用 API,将导致阻塞用户交互。为了避免这种情况,您应该异步调用 ISDiskCache
的 API。此问题的推荐解决方案是使用从服务器加载数据的 NSOperation
API。另一种解决方案是像下面一样在 dispatch queue 中调用 API。
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_async(queue, ^{
UIImage *image = [diskCache objectForKey:URL];
dispatch_async(dispatch_get_main_queue(), ^{
UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
cell.imageView.image = image;
});
});
例如,查看演示应用程序中的 ISViewController
。
如果您想一起使用快速缓存,请使用 ISMemoryCache。
UIImageView *imageView;
NSURL *URL = [NSURL URLWithString:@"http://example.com"];
imageView.image = [[ISMemoryCache sharedCache] objectForKey:URL];
if (imageView.image == nil && [[ISDiskCache sharedCache] hasObjectForKey:URL]) {
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_async(queue, ^{
UIImage *image = [diskCache objectForKey:URL];
dispatch_async(dispatch_get_main_queue(), ^{
UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
cell.imageView.image = image;
});
});
}
ISDiskCache
使用 MD5 哈希从键中获取文件路径。
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:key];
unsigned char result[16];
CC_MD5([data bytes], [data length], result);
NSString *fileName = [NSString stringWithFormat:@"%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X",
result[0], result[1], result[2], result[3], result[4], result[5], result[6], result[7],
result[8], result[9], result[10], result[11],result[12], result[13], result[14], result[15]];
版权所有 (c) 2013-2014 Yosuke Ishikawa
本软件及其相关文档(统称为“软件”)的副本获取者,在无任何费用的前提下,获得以下授权:自由地处理软件,包括但不限于使用、复制、修改、合并、发布、分发、再许可和/或销售软件副本,以及授权将软件提供给他人以便他们也能这样做,但须遵守以下条件:
上述版权声明和本许可声明应包含在软件所有副本或实质性部分的副本中。
软件按“现状”提供,不提供任何形式的质量保证,明示或暗示的,包括但不限于商售性、特定目的适用性和非侵权性保证。在任何情况下,作者或版权所有者不对任何索赔、损害或其他责任承担责任,无论这些责任是在合同行为、侵权行为或其他任何情况下产生的,无论是在软件或其使用或其他与软件相关的环境中产生的。