收银器是一个缓存框架,使得与持久化数据的工作变得简单。
创建和访问收银器对象
Cashier* cashier = [Cashier cacheWithId:@"cacheID"]; // get/create a Cashier object with id "cacheID"
Cashier* defaultCashier = Cashier.defaultCache; // get/create a the default cache.
用于创建和访问收银器对象的方法相同。如果指定的id的收银器对象之前尚未创建,则将创建并返回它。如果它已经存在,则返回现有的一个。
在收银器对象中缓存NSString
Cashier* cashier = [Cashier cacheWithId:@"stringCache"]; // get/create a Cashier object with id "stringCache"
[cashier setObject: stringToCache forKey:@"stringCacheKey"]; // add an object to the cache
NSString* stringFromCache = [cashier objectForKey: @"stringCacheKey"]; // get the object from the cache
在收银器对象中缓存NSData
Cashier* cashier = [Cashier cacheWithId:@"dataCache"]; // get/create a Cashier object with id "dataCache"
[cashier setData: yourNSDataObject forKey:@"dataCacheKey"]; // add an object to the cache
NSData* dataFromCache = [cashier dataForKey:@"dataCacheKey"]; // get the object from the cache
在收银器对象中缓存UIImage
Cashier* cashier = [Cashier cacheWithId:@"imageCache"]; // get/create a Cashier object with id "imageCache"
[cashier setImage: yourUIImage forKey:@"imageCacheKey"]; // add an object to the cache
UIImage* imageFromCache = [cashier imageForKey:@"imageCacheKey"]; // get the object from the cache
在收银器对象中缓存任何其他类型的对象(包括自定义对象)
Cashier* cashier = [Cashier cacheWithId:@"cacheID"]; // get/create a Cashier object with id "cacheID"
YourObject *yourObject = [[YourObject alloc] init];
[cashier setObject: yourObject forKey:@"cacheKey"]; // add an object to the cache
YourObject* stringFromCache = [cashier objectForKey:@"cacheKey"]; // get the object from the cache
您可以使用以下方法从缓存中获取类型化对象
- (UIImage *)imageForKey:(NSString *)key;
- (NSData *)dataForKey:(NSString *)key;
- (NSDictionary *)dictionaryForKey:(NSString *)key;
- (NSArray *)arrayForKey:(NSString *)key;
- (NSString *)stringForKey:(NSString *)key;
持久性
收银器对象包含两层缓存。如果将persistent
属性设置为NO
,则对象将缓存在内存中,使用NSCache。如果persistent
设置为YES
,则对象将被写入到Library/Caches
文件夹中的文件。这意味着其内容不被iTunes备份,可能被系统删除。有关iOS文件系统的更多信息,请参阅iOS文件系统。
Cashier* cashier = [Cashier cacheWithId:@"cacheID"]; // get/create a Cashier object with id "cacheID"
cashier.persistent = YES; // makes the Cashier cache the objects in files
cashier.persistent = NO; // makes the Cashier cache the objects in memory
对于没有保存在Library/Caches
文件夹中的持久数据,请使用NOPersistentStore
。这是Cashier
的一个子类,与Cashier
的工作方式完全相同,但它将数据保存到Documents/NOCache
文件夹中,该文件夹不会在设备空间不足时由系统清理。
NOPersistentStore* persistentStore = [NOPersistentStore cacheWithId:@"persistentStoreId"]; // get/create an NOPersistentStore object with id "persistentStoreId"
过期时间
Cashier
对象有一个lifespan
。这决定了缓存对象在被视为过期之前应该有效多长时间。如果缓存对象比缓存的有效期旧,它们将被视为过期。过期的对象被视为无效,但不会被删除。如果您想同时使用过期数据,请将returnsExpiredData
设置为YES
。lifespan
默认为0,这意味着数据永远不会过期。
Cashier* cashier = [Cashier cacheWithId:@"cacheID"]; // get/create a Cashier object with id "cacheID"
cashier.lifespan = 60; // makes the cached objects have a lifespan of one minute
cashier.returnsExpiredData = NO; // makes the cache not return cached objects after their lifespan has passed
YourObject *yourObject = [[YourObject alloc] init];
[cashier setObject: yourObject forKey:@"cacheKey"];
// after one minute
[cashier objectForKeyIsValid:@"cacheKey"] // NO
[cashier objectForKey:@"cacheKey"] // nil
Cashier* cashier = [Cashier cacheWithId:@"cacheID"]; // get/create a Cashier object with id "cacheID"
cashier.lifespan = 60; // makes the cached objects have a lifespan of one minute
cashier.returnsExpiredData = YES; // makes the cache return cached objects after their lifespan has passed
YourObject *yourObject = [[YourObject alloc] init];
[cashier setObject: yourObject forKey:@"cacheKey"];
// after one minute
[cashier objectForKeyIsValid:@"cacheKey"] // NO
[cashier objectForKey:@"cacheKey"] // yourObject
可以使用- (void)refreshValidationOnObjectForKey:(NSString *)key;
方法刷新对象的验证时间戳。这会将缓存对象最后验证的时间戳更新为当前时间戳。这意味着如果一个对象有一个1分钟的生存期,但后来我们刷新了其验证,它将从刷新验证的那一刻开始有1分钟的生存期。
Cashier* cashier = [Cashier cacheWithId:@"cacheID"]; // get/create a Cashier object with id "cacheID"
cashier.lifespan = 60; // makes the cached objects have a lifespan of one minute
YourObject *yourObject = [[YourObject alloc] init];
[cashier setObject: yourObject forKey:@"cacheKey"];
// after 30 seconds
[cashier refreshValidationOnObjectForKey:@"cacheKey"];
// after another 40 seconds
[cashier objectForKeyIsValid:@"cacheKey"] // YES
persistCacheAcrossVersions
属性决定当前缓存的内容是否在应用版本更新时保持不变。默认情况下 persistCacheAcrossVersions
为 false。这是因为如果模型发生变化,如果应用从缓存中获取旧数据,而预期它在外观上有所不同,则可能导致应用崩溃。
安全性
encryptionEnabled
决定当前缓存的内容是否写入受保护的文件。如果 encryptionEnabled
为 false,则将缓存对象写入的文件将使用 NSDataWritingFileProtectionComplete 进行写入。如果 encryptionEnabled
为 false,则写入缓存对象的文件将不受保护。默认情况下 encryptionEnabled
为 false。
使用指南
Cashier.defaultCache
获取对缓存的简单访问。用
Cashier 遵循 MIT 许可协议。有关更多信息,请参阅 LICENSE 文件。