TSFileCache
是一个简单的通用类,用于在磁盘上缓存某些类型的文件 - 这些文件将在以后用作例如表视图单元格中的图标等。
如果您喜欢它... :)
您可以通过两种设计的初始化方法之一创建类的实例。您可以使用方法 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 在Apache 2.0许可证下可用。
版权 © 2014 Tomasz Szulc
根据Apache许可证版本2.0(“许可证”);除非符合许可证的要求,否则不得使用此文件。您可以在以下地址获取许可证的副本:
http://www.apache.org/licenses/LICENSE-2.0
除非适用法律要求或在书面同意的情况下,否则在许可证下分发的软件按照“现状”基础分发,不提供任何类型的保证或条件,无论是明示的还是隐含的。有关许可证中规定的具体权限和限制,请参阅许可证。