如果我设置了一个NSUserDefault对象,并试图在同步之前访问它,那么我是否能够访问我刚刚添加的对象?
我尝试过编写代码来测试它,但是我不确定synchronization是否在我不知道的情况下发生。
发布于 2013-06-19 05:28:26
是的,您的应用程序可以在synchronize发生之前访问保存的首选项,如果它是在应用程序的同一运行会话期间读取周期之前保存的。为了在随后的应用程序启动期间访问信息,有必要进行同步。
苹果文档:NSUserDefaults
NSUserDefaults缓存信息,以避免每次需要默认值时都必须打开用户的默认数据库。定期自动调用的同步方法使内存缓存与用户的默认数据库保持同步。
synchronize方法将对内存中缓存的任何修改写入磁盘(Library/Preferences中的plist文件),并将未修改的内存缓存更新为最新的磁盘。该方法被周期性地调用,而不通知应用程序。
再次从docs:[NSUserDefaults synchronize]
讨论 由于此方法是定期自动调用的,因此,只有在无法等待自动同步(例如,如果应用程序即将退出时)或如果您希望将用户默认值更新到磁盘上的默认内容,即使您没有做任何更改,才使用此方法。
在我的经验中,在应用程序退出时显式调用synchronize方法,这将确保在下次启动时可以使用最新的首选项。然而,当应用程序在synchronize发生之前崩溃时,我也遇到了一些场景,因此pref不被存储。您的应用程序必须能够处理这些场景。
附加
使用NSUserDefaults存储最小的数据,不要存储巨大的数据。原因是,应用程序默认是在应用程序启动期间加载的,如果要加载的数据很大,那么应用程序加载时间就会增加,应用程序被Springboard杀死的可能性也会增加。
发布于 2013-06-19 05:11:56
[NSUserDefault synchronize];的目的是使用户的默认值立即写入磁盘。
关于这个的:
我不确定同步是否在我不知道的情况下发生。
您不需要显式地调用[NSUserDefault synchronize]来存储值,iOS已经在适当的时间(比如进入后台时)这样做了。因此,除非您想立即存储该值,否则可以避免该行。实际上,如果每次设置值时都调用synchronize,则会导致性能问题。
https://stackoverflow.com/questions/17183183
复制相似问题