【问题标题】:iOS NSUserDefaults access before synchronize completioniOS NSUserDefaults 同步完成前的访问
【发布时间】:2013-06-19 05:00:25
【问题描述】:

如果我设置了一个NSUserDefault 对象并尝试在它同步之前访问它,我是否能够访问我刚刚添加的对象?

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

【问题讨论】:

    标签: ios objective-c nsuserdefaults synchronize


    【解决方案1】:

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

    来自 Apple 文档:NSUserDefaults

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

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

    再次来自文档:[NSUserDefaults synchronize]

    讨论
    因为此方法会定期自动调用,所以仅当您无法等待自动同步(例如,如果您的应用程序即将退出)或您想要更新用户默认值到磁盘上的内容时才使用此方法,即使您没有进行任何更改。

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

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

    【讨论】:

    • 所以100%确定如果用户快速向上滑动应用程序,不会丢失任何用户默认值?
    【解决方案2】:

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

    关于这个:

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

    您不需要显式调用[NSUserDefault synchronize] 来存储值,iOS 已经在适当的时间(例如进入后台时)执行此操作。 因此,除非您想立即存储该值,否则您可以避免使用该行。 其实每次设置值都调用sync是性能问题。

    【讨论】:

    • 我仍然想知道我原来的问题,因为我设置了一个表格视图,用户可以在其中输入一个选项,并且表格会在输入后立即刷新。在加载表期间,它使用 NSUserDefaults 加载值。所以我想知道如果我不调用同步,我的表会加载正确的值吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-11-24
    • 2023-04-04
    • 1970-01-01
    • 2011-09-01
    • 2012-03-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多