【问题标题】:Writing an NSCache to disk with NSKeyedArchiver使用 NSKeyedArchiver 将 NSCache 写入磁盘
【发布时间】:2016-02-17 19:34:47
【问题描述】:

我需要一个字典来保存有限数量的需要通过 Internet 连接创建的对象并缓存它们,以便在没有 Internet 连接时它们仍然可用。

NSCache 看起来很理想,因为我可以指定一个限制,或者它会根据可用内存自动调整自己,但我无法将对象保存到NSUserDefaults。如果我尝试像这样缓存,这适用于NSDictionary

+ (void)cacheUsers:(NSCache *)users {
    NSData *data = [NSKeyedArchiver archivedDataWithRootObject:users];
    [[NSUserDefaults standardUserDefaults] setObject:data forKey:kCacheID];
}

应用崩溃:[NSCache encodeWithCoder:]: unrecognized selector sent to instance

我是否应该在缓存之前将NSCache 转换为NSDictionary,然后在检索时再次转换?或者有没有更好的方法来保存NSCache

【问题讨论】:

  • NSCache 没有实现 NSCoding,所以不能存档。
  • 另外,我想知道您打算如何将缓存转换为字典? NSCache 没有用于遍历内容的 API...
  • 是的,这将是我的下一个问题。我想我必须扩展 NSMutableDictionary 以使其与 NSCache 基本相同......好吧苹果
  • 你到底想达到什么目的?
  • 我明白了。在这种情况下,您确实需要编写自己的对象存储库,以明确定义的方式丢弃项目并支持归档。 IMO NSCache 不适合这种情况(即使您可以将其存档),因为 Apple 对其驱逐政策不做任何保证。例如。在 iOS 上,当应用进入后台时,所有 NSCache 都会被清除。

标签: ios objective-c cocoa-touch nscoding nscache


【解决方案1】:

我假设您正在尝试使用自定义类对象保存数组, 为此,您需要在自定义类中实现名为“encodeWithCoder”的方法,以便将其保存到 NSUserDefault。

对我来说,你不需要使用 NSCache。

请参阅下面的相关答案: https://stackoverflow.com/a/2315972/1982185

祝你好运!

【讨论】:

  • 为什么不直接用自定义对象保存数组,而不是用 NSCache 保存数组。
  • 加载的用户数可能是无限的,所以我需要在内存紧张的时候释放一些。
  • 另外,NSCache 不是数组,它是字典
  • 我的意思是将包含自定义对象的数组保存到 NSUserDefault。
  • 哦,我的代码中有一个错字,使它看起来像一个数组。对困惑感到抱歉。我已经更新了
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-08-18
  • 2017-10-19
  • 2013-08-30
  • 2013-03-05
  • 2019-07-16
  • 2017-04-24
  • 2011-02-20
相关资源
最近更新 更多