ISDiskCache 0.1.3

ISDiskCache 0.1.3

测试已测试
Lang语言 Obj-CObjective C
许可 MIT
发布最后发布2014年12月

Yosuke Ishikawa 维护。



  • Yosuke Ishikawa 编写

iOS 的 LRU 磁盘缓存。

要求

  • iOS 4.3 或更高版本
  • ARC

功能

  • 使用访问日期自动删除旧文件。
  • 只要它符合 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

如果您想一起使用快速缓存,请使用 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

本软件及其相关文档(统称为“软件”)的副本获取者,在无任何费用的前提下,获得以下授权:自由地处理软件,包括但不限于使用、复制、修改、合并、发布、分发、再许可和/或销售软件副本,以及授权将软件提供给他人以便他们也能这样做,但须遵守以下条件:

上述版权声明和本许可声明应包含在软件所有副本或实质性部分的副本中。

软件按“现状”提供,不提供任何形式的质量保证,明示或暗示的,包括但不限于商售性、特定目的适用性和非侵权性保证。在任何情况下,作者或版权所有者不对任何索赔、损害或其他责任承担责任,无论这些责任是在合同行为、侵权行为或其他任何情况下产生的,无论是在软件或其使用或其他与软件相关的环境中产生的。