NSUserDefaults同步方法

时间:2012-03-10 16:12:04

标签: iphone cocoa-touch

 NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
[defaults setObject:@"xxxxxxxx" forKey:@"name"];

[defaults synchronize];

我需要知道为什么我必须使用上面代码[defaults synchronize]的最后一行?使用它的目的是什么?这是必须的吗?

4 个答案:

答案 0 :(得分:95)

[default synchronize];的目的是使用户默认值立即写入磁盘 。你不需要明确地调用它,iOS已经在适当的时候完成它。所以你可以删除该行。实际上,如果每次设置默认值时都调用synchronize,则会出现性能问题。

在iOS 7之前,当应用程序转换为后台时,用户默认值始终是同步的。从iOS 7开始,情况已经不再如此,因此您可能需要在应用代理synchronize中调用applicationDidEnterBackground:或注册UIApplicationDidEnterBackgroundNotification通知来执行此操作。

来自the documentation for -[NSUserDefaults synchronize]:

  

因为此方法是定期自动调用的,所以只有在您不能等待自动同步时(例如,如果您的应用程序即将退出)或者您希望将用户默认值更新为打开时,才使用此方法即使您没有进行任何更改,也可以使用磁盘。

答案 1 :(得分:14)

您不必再写那行了。

更新后的documentation

中的方法参考
  

等待默认数据库的任何挂起的异步更新   并返回;这种方法是不必要的,不应该使用。

对解释该怎么做的方法的评论。

     /*!
     -synchronize is deprecated and will be marked with the NS_DEPRECATED macro in a future release.

     -synchronize blocks the calling thread until all in-progress set operations have completed. This is no longer necessary. Replacements for previous uses of -synchronize depend on what the intent of calling synchronize was. If you synchronized...
     - ...before reading in order to fetch updated values: remove the synchronize call
     - ...after writing in order to notify another program to read: the other program can use KVO to observe the default without needing to notify
     - ...before exiting in a non-app (command line tool, agent, or daemon) process: call CFPreferencesAppSynchronize(kCFPreferencesCurrentApplication)
     - ...for any other reason: remove the synchronize call
      */
     open func synchronize() -> Bool

答案 2 :(得分:5)

是的,使用该行,您告诉系统使用新的默认值上传NSUserDefaults。

您可以在此处找到所有信息:

答案 3 :(得分:0)

iOS 12 发行说明(https://developer.apple.com/documentation/ios_ipados_release_notes/ios_12_release_notes/foundation_release_notes?language=objc)中,您可以找到以下信息:

NSUserDefaults has several bug fixes and improvements:

Removed synchronization requirements. It's no longer
necessary to use synchronize, CFPreferencesAppSynchronize,
or CFPreferencesSynchronize. These methods will be deprecated
in a future version of the OS.

因此,如果您使用 iOS 12 和更高版本定位设备,则根据上述发行说明,它应该可以正常工作而无需调用同步功能。但是,如果您仍然支持 iOS 11 及更低版本,则可能仍需要调用syncize方法。