NSUserDefaults 性能问题

NSUserDefaults performance concerns

我有一款游戏,我一直在保存用户进度。这是一款进度非常快的游戏,在游戏的某些时刻,大量用户进度可能每秒发生 6 次,这需要我在 NSUserDefaults 中存储一些进度变量并每秒同步 6 次。这在我的 iPhone6s 64gb 上运行良好,但我担心 iPhone4 16gb 可能无法处理。

不过我无法对其进行测试,因为模拟器对于此类事情并不十分准确,而且我没有速度较慢的设备。我似乎也无法在文档中找到有关 NSUserDefaults 性能报告的许多详细信息。有没有人对这个话题有任何了解?

我正在考虑将变量存储在我将在我的 .h 中定义的本地 NSDictionary 中,然后在 appWillResignActive 期间保存和同步 NSUserDefaults 一次,但我担心在崩溃、设备电池耗尽时数据丢失等。我想我可以有一个 NSTimer 并每 5 秒左右保存一次数据,并保存在 appWillResignActive 上,以尽量减少崩溃时的损失;我宁愿不必重新编写大量代码,尽管 NSUserDefaults 可能能够在较小的设备上处理得很好。

不要每秒调用 6 次同步。 (不要每秒执行 6 次任何基于磁盘的操作。)系统负责为您保存用户默认值。正如你所说,在appWillResignActive中调用synchronize是合理的,还是层级之间。

如果您崩溃了,预计会丢失一些数据。但是,编写良好的应用程序不应该崩溃。如果您经常崩溃,那是您的问题,而不是同步用户默认设置。 (不是说您的应用会那样做)

NSUserDefaults只是记忆中的一个NSDictionary。只要您没有在每次设置值时不必要地调用 synchronize,就不会有任何问题。 OS 将每隔一段时间保留内存中的表示。当然不是每秒多次。

因此,请尽可能多地使用 NSUserDefaults。仅在极少数情况下调用 synchronize,例如当您的应用变得不活动或进入后台时。