NSUserDefaults 导致性能问题

NSUserDefaults causing performance issues

我相信我有 CPU 过度使用 NSUserDefaults 导致的性能问题。这可能吗?

我正在调试一些使用它来存储大量用户数据的代码,现在每次调用存储数据的后续调用都超过 4 秒。

什么会导致这些长时间的延迟?

// Save data in user defaults
NSDate *timerStartTime = [NSDate date];

NSLog(@"Data Size %lu", (unsigned long)[result.data length]);
[self setObject:result.data forKey:defaultName];
NSTimeInterval elapsed = [[NSDate date] timeIntervalSinceDate:timerStartTime];
NSLog(@"Time For Function: %f", elapsed);

输出:

Time For Function: 4.1

如果你要存储大量数据,你绝对不应该使用 NSUserDefaults 来这样做。

NSUserDefaults 适用于标志、简单设置或用户变量(如昵称)等。本质上是用户偏好。

这是因为:

  • NSUserDefaults 每次加载时都会完整加载和保存。
  • NSUserDefaults 在应用程序启动时加载,因此您不能 线程其加载过程。

应该使用 Core Data 来存储数据: https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/CoreData/cdProgrammingGuide.html

或者,如果它只是一个字典或字符串数​​组,您可以使用 属性 列表: https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/PropertyLists/Introduction/Introduction.html

NSUserDefaults 确实使用 pList 来存储其数据,因此您会遇到一些相同的限制,但您将对何时以及如何写入或读取数据有更多的控制权。此外,当 NSUserDefaults 具有预期的偏好目的时,将 NSUserDefaults 用作临时数据库也不是好的做法。