【问题标题】:When and why does NSUserDefaults' synchronize method fail?NSUserDefaults 的同步方法何时以及为什么会失败?
【发布时间】:2010-12-04 14:11:36
【问题描述】:

NSUserDefaults 的同步方法何时以及为什么会失败?确保我的值实际写入并提交给 NSUserDefaults 的最佳方法是什么,这样在应用程序重新启动后恢复状态不会有任何问题?

【问题讨论】:

    标签: iphone nsuserdefaults synchronize


    【解决方案1】:

    synchronize 方法是围绕CFPreferencesSynchronize 函数的更高级别的 API 包装器。文档中没有任何内容,但我认为synchronize 只是返回CFPreferencesSynchronize 的结果。由于此 CoreFoundation 功能可用于同步主机(管理员)和基于网络的首选项,因此在某些情况下可能会失败。

    在最常见的情况下,应用程序只是同步其用户域首选项(在当前用户的库目录中),该功能通常不会失败。我认为忽略synchronize 的返回值是安全的。但这只是我的看法。

    【讨论】:

    • +1 用于 CFPreferencesSynchronize 参考,但检查同步调用的结果对我来说非常重要。我的应用程序确实同步了它的用户域首选项,但我刚刚意识到这也可能会失败,并且在这种情况下返回值是 NO 是正确的。在某些情况下,我的应用程序试图用某个键写入一个 nil 值,这导致同步失败。现在我在保存之前检查 nil 的值,问题得到解决。还是谢谢你!
    • 有趣。我原以为这会导致设置失败,而不是同步。
    【解决方案2】:

    在某些情况下,我的应用程序试图用某个键写入 nil 值,这导致同步失败。现在我在保存之前检查 nil 的值,问题就解决了。

    【讨论】:

      【解决方案3】:

      在我的情况下,我错误地使用了 NSUserDefaults,它会失败。 比如我定义了自己的对象,放到NSUserDefaults或者NSDictionary里面,可以放入,但是同步的时候会失败。因为 NSUserDefaults 不支持所有类型的对象。 据我所知,NSString、NSNumber、NSDictionary....你可以google一下如何让自定义类可以存储在NSUserDefaults中。

      【讨论】:

      • NSString、NSNumber 和其他原生对象可以存储在 NSUserDefaults 中,因为它们实现了 NSCoding 协议。如果你实现了 NSCoding 协议,你也可以在那里存储你自己的对象。
      猜你喜欢
      • 2011-02-26
      • 2012-03-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多