TSFileCache 1.0.4

TSFileCache 1.0.4

测试测试
Lang语言 Obj-CObjective C
许可证 自定义
发布最后发布2014年12月

未指派 维护。



TSFileCache 是一个简单的通用类,用于在磁盘上缓存某些类型的文件 - 这些文件将在以后用作例如表视图单元格中的图标等。

捐赠

如果您喜欢它... :)

Flattr this

如何工作?

您可以通过两种设计的初始化方法之一创建类的实例。您可以使用方法 cacheForURL: 创建使用某些目录的缓存,但您也可以(我推荐这个选项)使用 cacheInTemporaryDirectoryWithRelativeURL: 方法,它使用系统管理的沙盒临时目录内的目录,这样您就可以忘记清理该目录。

+cacheForURL:

NSURL *directoryURL = [NSURL fileURLWithPath:...];
TSFileCache *cache = [TSFileCache cacheForURL:directoryURL];

+cacheInTemporaryDirectoryWithRelativeURL:

NSURL *url = [NSURL URLWithString:@"/Cache"];
TSFileCache *cache = [TSFileCache cacheInTemporaryDirectoryWithRelativeURL:url];

创建实例后,您必须调用 prepare: 方法。它准备目录用于工作与文件。如果目录存在则不做任何操作,但如果目录不存在,它会尝试创建并返回错误(建议将 NSError 对象传递给方法参数)。

-prepare:
TSFileCache *cache = [TSFileCache cacheInTemporaryDirectoryWithRelativeURL:[NSURL URLWithString:@"/Cache"]];

NSError *error = nil;
[cache prepare:&error];
if (error) {
    /// do something here
}

可以通过 setSharedInstance: 方法将实例设置为单例并通过 sharedInstance 获取。您必须知道,sharedInstance 方法不创建任何 TSFileCache 类的实例 - 它只是返回之前通过 setSharedInstance 设置的实例,否则返回 nil。

+setSharedInstance:

TSFileCache *cache = [TSFileCache cacheInTemporaryDirectoryWithRelativeURL:[NSURL URLWithString:@"/Cache/Icons"]];
[TSFileCache setSharedInstance:cache]; /// set

+sharedInstance

TSFileCache fileCache = [TSFileCache sharedInstance];

当实例配置完成后,使用 storeData:forKey: 在磁盘上存储数据,key 用作文件名。如果存在该 key 的文件,则会覆盖该文件。要为 key 读取数据,请使用 dataForKey: 方法。如果该 key 对应的文件不存在,则返回 nil。

-storeData:forKey:

UIImage *image = [UIImage imageNamed:@"image.png"];
NSData *data = UIImagePNGRepresentation(image);
[cache storeData:data forKey:@"key"];    

-dataForKey:

NSData *data = [cache dataForKey:@"key"];

如果你要检查键是否已设置以及是否已缓存该键的文件,请使用 existsDataForKey: 方法,而不是 dataForKey: 方法。这样做的原因是,你可能不知道缓存文件的有多大,读取这个文件可能需要花费很多时间。相反,只需要简单地检查文件是否存在。

-storeDataForUndefinedKey:

NSString *key = [cache storeDataForUndefinedKey:data];

如果你不知道应该存储数据的键,你也可以使用方法 -storeDataForUndefinedKey: 来存储数据。键将由方法生成并返回。键是唯一的。

-removeDataForKey:

[cache removeDataForKey:key];

要删除缓存文件,请调用 removeDataForKey

-existsDataForKey:

BOOL exists = [cache existsDataForKey:@"key"];

TSFileCache 也可以作为字典使用,所以你可以这样做

NSData *data = ...;
_cache[key] = data; /// instead of [_cache storeData:data forKey:key];
id readData = _cache[key]; /// instead of [_cache dataForKey:key];

如果你想将 TSFileCache 作为子类并想使用此机制与其他类型(而非 NSData)一起,你必须创建相同的方法,但使用其他类型 - 查看示例。

TSFileCache 在内部使用 NSCache,因此当数据第一次被读取时,该键的值将存储在 NSCache 中,下次如果数据仍在缓存中,它将被使用,而无需再次从磁盘读取。系统控制 NSCache 实例,数据可以在任何时候从缓存中删除。如果你再次读取已缓存但现在不再缓存的数据,TSFileCache 将会从磁盘读取此数据并再次将其缓存。

如果你希望在文件缓存时清除目录,请使用 clear 方法。目录将仍然存在,但将是空的。

-clear

[cache clear];

我还添加了一些宏,这可能在子类化时很有帮助,因为可能某些方法在子类中是不必要的。我在此存储库中的 TSImageCache 示例中使用了这个宏。这个宏使用 __attribute__(unavailable(...)) 并防止在 TSFileCache 的子类中调用不应调用的方法。这个宏被定义为 __TSFileCacheUnavailable__,以下是一个简单的用法示例

+ (instancetype)cacheInTemporaryDirectoryWithRelativeURL:(NSURL *)relativeURL __TSFileCacheUnavailable__;

-allKeys

NSArray *keys = [cache allKeys];

使用 allKeys 方法获取缓存目录内的所有键。

-attributesOfFileForKey:error:

NSDictionary *attributes = [_fileCache attributesOfFileForKey:key error:nil];

使用此方法来获取缓存文件的属性。

日志

1.0.4:

  • cache 现在作为一个 readonly 属性被公开。之前是私有 ivar。这是因为性能问题。有时,比如将 UIImage 存储在 cache 而不是 NSData 更好,每次都需要将 NSData 转换为 UIImage。请参考 TSImageCache 示例。

1.0.3:

  • 添加了 -removeDataForKey: 方法。

1.0.2:

  • 实现了 -storeDataForUndefinedKey: 方法。

  • -prepare: 方法返回 BOOL,之前是空的。这是因为静态代码分析警告。

  • 实现了 -allKeys 方法。

  • 实现了 -attributesOfFileForKey:error:

1.0.1:

  • 实现了索引。 TSFileCache 实例作为一个字典工作。实例[@"key"];id data = instance[@"key"];

  • 添加了用于获取指定键值的 `existsDataForKey:` 方法。因为性能原因而添加。

  • directoryURL 属性现在没有作为 readonly 公开(之前是隐藏的,但它可能有助于知道包含缓存文件目录的路径),

1.0:

  • TSFileCache 已发布。

许可证

TSFileCache 在Apache 2.0许可证下可用。

版权 © 2014 Tomasz Szulc

根据Apache许可证版本2.0(“许可证”);除非符合许可证的要求,否则不得使用此文件。您可以在以下地址获取许可证的副本:

http://www.apache.org/licenses/LICENSE-2.0

除非适用法律要求或在书面同意的情况下,否则在许可证下分发的软件按照“现状”基础分发,不提供任何类型的保证或条件,无论是明示的还是隐含的。有关许可证中规定的具体权限和限制,请参阅许可证。