在同步完成之前,iOS NSUserDefaults访问

时间:2013-06-19 05:00:25

标签: ios objective-c nsuserdefaults synchronize

如果我设置NSUserDefault对象并尝试在同步之前访问它,我是否可以访问刚刚添加的对象?

我已经尝试编写代码来测试它,但我不确定同步是否在我不知情的情况下发生。

2 个答案:

答案 0 :(得分:7)

是的,如果在应用程序的同一运行会话期间发生读取周期之前保存,则应用程序可以在synchronize发生之前访问已保存的首选项。为了在后续应用程序启动期间访问信息,必须进行同步。

来自Apple文档:NSUserDefaults

  

NSUserDefaults缓存信息,以避免每次需要默认值时都必须打开用户的默认数据库。 synchronize方法会定期自动调用,使内存缓存与用户的默认数据库保持同步。

synchronize方法将对内存缓存的任何修改写入磁盘(Library/Preferences中的plist文件),并将未修改的内存缓存更新为磁盘上的最新缓存。此方法会定期调用,而不会通知应用程序。

再次从文档中[NSUserDefaults synchronize]

  

<强>讨论
  因为此方法是定期自动调用的,所以只有在您无法等待自动同步时(例如,如果您的应用程序即将退出)或者您希望将用户默认值更新为磁盘上的内容,请使用此方法你没有做任何改变。

根据我的经验,在应用程序退出时显式调用synchronize方法,这可确保在下次启动时可以使用最新的首选项。但是,我还遇到了synchronize发生之前应用程序崩溃的情况,因此不存储pref。您的应用程序必须能够处理这些方案。

附加
使用NSUserDefaults存储最少的数据,不存储大量数据。原因是,在应用启动期间加载应用默认值,如果要加载的数据很大,那么应用加载时间会增加,并且应用可能被Springboard杀死。

答案 1 :(得分:0)

[NSUserDefault synchronize];的目的是使用户默认值立即写入磁盘。

关于此:

  

我不确定在我不知情的情况下是否发生了同步   它

您无需显式调用[NSUserDefault synchronize]来存储值,iOS已经在适当的时候执行(如进入后台时)。 因此,除非您想立即存储该值,否则可以避免该行。 实际上,如果每次设置值都调用synchronize,则会出现性能问题。