2016-11-25 94 views
5

所以我看了一下NSUserDefaults的synchronize()方法的苹果文档。见下面以供参考:何时以及为什么要使用NSUserDefaults的synchronize()方法?

https://developer.apple.com/reference/foundation/userdefaults/1414005-synchronize

页当前读取:

因为这个方法是每隔一段时间自动调用,使用此方法仅如果你不能等待自动同步(例如,如果您的应用程序即将退出),或者即使您未做任何更改,也希望将用户的默认值更新为磁盘上的内容。

但是,我仍然不明白的是什么时候应该调用这个方法?例如,每当用户更改应用程序的设置时,它是否应该被调用?或者我应该相信背景API将会处理这个问题?在内存更改设置后立即离开视图会导致该更改丢失?

另外,什么时候调用synchronize()失败会导致用户设置没有正确更改?

此外,调用此方法的成本(性能,内存或其他)是多少?我知道它涉及从磁盘读写数据,但是这真的会在手机上花费很多精力吗?

回答

18

似乎对用户的默认有太多的困惑。这样想想吧。这与您在整个应用程序中使用全局字典基本相同。如果您添加/编辑/删除全局字典中的键/值,则此更改会立即显示在代码中的任何位置。由于这本字典在内存中,所以当你的应用程序终止时,如果它没有保存到文件中,所有内容都会丢失。 NSUserDefaults每隔一段时间自动将字典保存到文件中。

synchronize方法的唯一原因是您的应用程序可以告诉NSUserDefaults将字典“now”保留,而不是等待最终会发生的自动保存。

而你需要这么做的唯一原因是因为你的应用可能在下一次自动保存之前被终止(或崩溃)。

在我自己的应用程序中,我唯一呼叫synchronize的地方在applicationDidEnterBackground委托方法中。这是为了确保最新未保存的更改在应用程序在后台终止的情况下保留下来。

我觉得很多困惑来自在开发过程中调试应用程序。在开发过程中,您通过调试器中的“停止”按钮关闭应用程序并不罕见。很多次这种情况发生在最近的NSUserDefaults更改仍然存在之前。所以我开发了一个习惯,在每次我想确保最新的更新被保留时,在调试器中杀死应用程序之前按主页按钮将我的应用程序置于后台。

鉴于上述总结,让我们回顾一下你的问题:

应该是每一个用户更改应用程序的设置时间来叫什么名字?

不可以。如上所述,任何更改都会立即自动提供。

或者我应该相信后台api会处理这个问题吗?

是的,请相信自动持续性,除非您的应用程序进入后台时调用synchronize

并且在内存中的设置更改导致该更改丢失后立即离开视图?

这没有效果。一旦您添加/编辑/删除NSUserDefaults中的某个键/值,就会进行更改。

另外,什么时候调用synchronize()失败会导致用户设置没有正确更改?

更改可能会丢失的唯一时间是您的应用程序在最新更改持续之前终止。当您的应用进入后台时调用synchronize可解决大部分这些问题。剩下的唯一可能的问题是如果你的应用程序崩溃。尚未保存的未保存的更改将会丢失。修复您的应用程序,使其不会崩溃。

此外,调用此方法的成本(性能,内存或其他)是多少?我知道它涉及从磁盘读写数据,但是这真的会在手机上花费很多精力吗?

自动持久性在后台完成,它只是将一个字典写入plist文件。这是非常快,除非你没有遵循建议。如果您错误地使用NSUserDefaults来存储大量数据,速度会变慢。

+0

伟大的答案!谢谢,这为我清除了很多东西,并根据我已阅读的内容制定了很多意义。 –

0

据我所知,同步用于立即同步数据,但iOS可以以智能方式处理数据。所以你不需要每次都调用它。如果你每次都调用它,那么它会转向性能问题。

检查苹果文档: Official Link

相关问题