代码之家  ›  专栏  ›  技术社区  ›  matt

iOS用户默认值落后于保存的内容

  •  -1
  • matt  · 技术社区  · 7 年前

    这种情况有点过于复杂,无法用语言来描述,因此我创建了一个最小的演示项目供您下载和运行:

    https://github.com/mattneub/DefaultsDemo

    您将需要Xcode 10来测试。这是项目运行时的样子:

    enter image description here

    真实的 应用程序(一个纸牌游戏)来重现我看到的问题。有一组卡片和一组卡片的布局,当用户点击Home按钮时,我们会收到一个通知,通知应用程序将退出活动状态,我们会将卡片和卡片布局保存到UserDefaults中。当我们重新启动时,我们检索牌组和卡片布局,用户可以继续玩。

    但我要解释的是,它工作不正常。实际上 看到这种现象很简单:

    1. 按洗牌键三到五次左右(如果你的牌用完了,按“新牌组”按钮。但在我的测试中,这通常是不必要的。)

    2. 回到Xcode,停止项目并再次运行,从步骤1开始。当我们启动时,你会被告知有多少张卡在刚从UserDefaults检索到的牌组中。

    继续重复这四个步骤。发生在我身上的是,大约两到三个周期后,第四步中的数字与第三步中的数字不同。我们不会从UserDefaults中恢复刚才保存到UserDefaults中的相同组!

    此外,关于这个错误的数字,我可以说得更多:这是我们保存到UserDefaults中的牌组中的牌数 在早些时候

    81 // launch
    65
    starting fresh 65
    62 // shuffle
    59 // shuffle
    56 // shuffle
    saving 56 // Home button
    

    好的,让我们从Xcode再次启动:

    retrieving 56 // launch
    53 // shuffle
    50 // shuffle
    47 // shuffle
    44 // shuffle
    saving 44 // Home button
    

    好吧,我们开始吧 再一次

    retrieving 56 // launch
    

    那就是虫子!我们落后了;我们要把甲板从船上拿回来 救命,不是我们刚救的那个(我可以通过打印卡片来证明这一点;它有一个 description 为了这个目的,我可以 看见

    所以问题是:为什么?我知道如何解决它;保存到文件而不是用户默认值。但我想知道是什么原因导致了这个问题。我 我保存到UserDefaults中的一个对象导致了某种无声的损坏,但我不明白这是怎么回事,因为它们只是数据对象。

    synchronize

    1 回复  |  直到 7 年前
        1
  •  0
  •   matt    7 年前

    我想说的是,整个项目都是一条红鲱鱼,问题在于你自己 .

    我认为 之后 每一个信号都表明变化已经发生( synchronize 已经回来了 didChange 通知已到达,以此类推)。

    因此,我打赌你只是 没有足够的时间 在按下Home按钮和再次运行应用程序之间。要知道可能是这样,请做以下更改:不要直接从第3步转到第4步,而是插入第3a步,从中数到10, . 现在,这个错误并没有表现出来。

    willResignActiveNotification