何时以及为什么要使用NSUserDefaults的synchronize()方法?

所以我看了一下NSUserDefaults的synchronize()方法的苹果文档。 请参阅下面的参考:

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

该页面当前显示为:

因为此方法是定期自动调用的,所以只有当您不能等待自动同步(例如,如果您的应用程序即将退出),或者如果要将用户默认更新为磁盘上的内容你没有做任何改变。

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

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

此外,调用此方法的成本(性能,内存或其他)是多less? 我知道这涉及到从磁盘读写数据,但是真的要在手机上付出很多的努力吗?

用户默认似乎有这么多混淆。 想想这样。 它基本上与您在整个应用程序中使用全局字典一样。 如果您添加/编辑/删除全局字典中的键/值,则该更改会立即在代码中的任何位置可见。 由于这个字典是在内存中,所以当你的应用程序终止时,如果它没有被保存到一个文件中,所有的都将会丢失。 NSUserDefaults自动将字典每NSUserDefaults自动保存到一个文件中。

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

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

在我自己的应用程序中,我调用的唯一synchronizeapplicationDidEnterBackground委托方法。 这是为了确保最新的未保存的更改持续在应用程序在后台终止的情况下。

我觉得很多困惑来自开发过程中debugging应用程序。 在开发过程中,通过debugging器中的“停止”button杀死应用程序并不罕见。 很多时候,在最近的NSUserDefaults更改持续之前发生这种情况。 所以我已经养成了把应用程序放在后台的习惯,在debugging器中杀掉应用程序之前,按下主页button,只要我想确保最新的更新被保留下来。

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

应该每次用户更改应用程序的设置时被调用?

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

或者我应该相信背景API将会处理这个问题?

是的,相信自动持久性,除了在应用程序进入后台时调用synchronize

在内存更改设置后立即离开视图会导致更改丢失?

这没有效果。 一旦在NSUserDefaults添加/编辑/删除键/值, NSUserDefaults发生更改。

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

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

此外,调用此方法的成本(性能,内存或其他)是多less? 我知道这涉及到从磁盘读取和写入数据,但是真的需要在手机上付出很多努力吗?

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

每次你设置或者更新NSUserDefaults的数据时,你都应该synchronnize它以确保它现在同步:

 [[NSUserDefaults standardUserDefaults] setObject:_userTextField.text forKey:@"user_local_account"]; // account [[NSUserDefaults standardUserDefaults] setObject:_pwdTextField.text forKey:@"user_local_password"]; // password // immediate synchronization [[NSUserDefaults standardUserDefaults] synchronize];