收银员 1.2.1

收银员 1.2.1

测试已测试
Lang语言 Obj-CObjective C
许可证 MIT
发布上次发布2016年11月

Nodes Agency维护。



收银员 1.2.1

收银器是一个缓存框架,使得与持久化数据的工作变得简单。

Readme Score

📝要求

  • iOS 8.0+ / macOS 10.10+ / tvOS 9.0+ / watchOS 2.0+
  • Xcode 8.1+

💻使用方法

创建和访问收银器对象

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设置为YESlifespan默认为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 获取对缓存的简单访问。
  • 我们不推荐使用默认缓存来存储大量数据(例如,表格视图的数据源),而是用于单个属性或对象。此外,还需考虑默认缓存不随版本更新而持久化的事实。

👥致谢

❤️Nodes

📄许可证

Cashier 遵循 MIT 许可协议。有关更多信息,请参阅 LICENSE 文件。