【问题标题】:NSUserDefaults sometimes returns wrong valueNSUserDefaults 有时会返回错误的值
【发布时间】:2015-11-13 12:29:50
【问题描述】:

我将用户的用户个人资料图片 ID 保存为 NSUserDefaults 中的字符串,例如@“12”。当我这样做时,我会立即调用同步方法。

当我从 NSUserDefaults 读取这个值时,它可能在 99% 的时间内返回 @"12"。但有时,它会返回一个不同的值(由于事件的稀有性,我无法找到它,但怀疑它是 nil 或某个默认值(?))。

我用来写/读的代码很简单:

NSUserDefaults* userDefaults = [NSUserDefaults standardUserDefaults];
[userDefaults setObject:@"12" forKey:@"photoID"];
[userDefaults synchronize];

NSString* photoID=[userDefaults objectForKey:@"photoID"];

我知道有时返回的值不正确,因为当时应用的行为就好像该值不同(即通知用户联系人,个人资料图片已更改)。

当这种情况发生时,对 objectForKey 的下一次调用会返回正确的值,因此用户联系人会收到另一个通知,即个人资料图片再次更改。

【问题讨论】:

  • 我只需要在更改默认值时调用同步,这种情况并不常见,所以不用担心。我怀疑删除它会改变任何事情,问题是需要几天时间才能确定错误是否再次出现。我希望听到遇到类似问题的人的来信,即 99% 以上的时间都可以正常工作,但有时却不行。
  • 并非所有错误都可以轻松重现。如果我知道行为或情况,我可能能够修复错误。我正在寻找的是经历过这个问题的人。我愿意尝试,但我很确定调用 synchronize 不会导致错误。
  • 我猜你是对的......很公平。
  • 我有一种感觉,错误不在您显示的代码中,而是在其他地方,如果您将该代码放在 for 循环中一百万次,它会给您 100% 的正确结果当时我相当确定。像这样的行为通常是线程没有正确互斥锁的结果
  • 你在猜测返回的值不正确,你需要创建一个测试。发生错误情况时打印蓝色。

标签: ios nsuserdefaults


【解决方案1】:

NSSynchronize 不保证成功并返回 BOOL。 请注意,syncrhonize 只是将数据写入磁盘,但 NSUserDefaults 也将数据保存在内存中。可能不需要在每次写入后调用它,尽管我自己已经完成了,并且网络上的许多示例都是这样做的。

来自 Apple 文档:

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

免责声明:推测
同步失败的行为可能导致 objectForKey 失败。该类知道它拥有的数据可能是错误的,因此返回 nil。如果您连续且过度调用同步或以其他方式执行 IO 密集型操作,则更有可能发生这种情况。

【讨论】:

  • 非常感谢,这听起来很合理。尽管应用程序不会经常调用同步(所以我不确定是不是因为这个),但很明显 get 方法在极少数情况下会失败。我刚刚与用户核实了一下,似乎他确实在事件发生前不久对其他设置进行了一些更改(因此调用了同步)。我想这只是运气不好的一个例子。无论如何,我现在将检查 get 方法是否返回 nil,只是想了解为什么会发生这种情况以及发生这种情况的频率。显然这是非常罕见的,因为我尝试复制但无法复制..
猜你喜欢
  • 1970-01-01
  • 2016-03-01
  • 1970-01-01
  • 2015-08-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-09
  • 2016-06-10
相关资源
最近更新 更多