在iOS 13中,何时保存数据?

在iOS 13中,何时保存数据?,ios,save,ios13,Ios,Save,Ios13,iOS 13中的场景支持和多个窗口使何时保存数据的问题变得复杂。场景代理的sceneDidEnterBackground似乎是一个不错的地方,但有时它还不够: 如果您的场景位于最前面,并且用户转到应用程序切换器并终止您的应用程序,您将获得sceneddisconnect,application将终止,而不是sceneddenterbackground 如果用户在您的应用程序位于最前端时关闭设备,您将得到应用程序将终止,而不是场景数据背景 在支持窗口场景和可能多个窗口的iOS 13应用程序中,

iOS 13中的场景支持和多个窗口使何时保存数据的问题变得复杂。场景代理的
sceneDidEnterBackground
似乎是一个不错的地方,但有时它还不够:

  • 如果您的场景位于最前面,并且用户转到应用程序切换器并终止您的应用程序,您将获得
    sceneddisconnect
    application将终止
    ,而不是
    sceneddenterbackground

  • 如果用户在您的应用程序位于最前端时关闭设备,您将得到
    应用程序将终止
    ,而不是
    场景数据背景

在支持窗口场景和可能多个窗口的iOS 13应用程序中,人们使用什么策略来管理数据保存?

来自以下文档:

如果场景中有未保存的用户数据,请将该数据保存在此处以确保不会丢失。但是,切勿仅从该方法保存数据。相反,通常在响应用户操作时,将其保存在视图控制器的适当位置。例如,当用户关闭数据输入屏幕时保存数据。不要依赖特定的应用程序转换来保存应用程序的所有关键数据

它们还在文档中说明:

在从内存中清除场景之前,使用此方法执行任何最终清理。例如,使用它来释放对文件或共享资源的引用,并保存用户数据


因此,看起来苹果公司建议我们在事件发生时保存用户数据,比如响应用户所做的事情(关闭视图控制器、切换开关、在文本字段中输入文本等),但我们可以使用
sceneWillResignActive(:)
和/或
sceneDidDisconnect(:)
如果我们需要或想要保存一些数据。

这里是第三种情况:用户打开应用程序的多个场景(每个场景都是全屏)。在前台查看其中一个全屏场景时,如果他们切换到应用程序切换器并从屏幕顶部滑动最近的场景,则该场景确实会调用其
sceneDidEnterBackground
。应用程序没有终止,因为还有另一个场景(当前在后台)。我是说“有”,我不是说“没有”。运行你的应用程序。让两个场景并排出现在屏幕上。将分隔器滑动到屏幕边缘,留下一个场景全屏显示。当然,另一个将转到后台,并为此调用
sceneDidEnterBackground
。现在双击home(主页)按钮打开应用程序切换程序。你看这两个场景。如果滑动刚刚留在前景中的场景,则该场景现在将调用其
sceneDidEnterBackground
。至少我的应用程序是这样的。@rmaddy好吧,我发现这非常令人困惑,不仅因为我在模拟器和设备上得到了不同的结果,还因为控制台穴居人使用OSLog进行调试并不完全可靠。用户在应用程序切换器中刷我们的情况非常困难,我在这里为它创建了一个单独的Q-and-a:如果我正确地阅读了你对另一个问题的答案(这与我看到的和我在前面的评论中发布的内容相匹配),那么这不就是你在这个问题上的第一个要点不正确吗?事实上,在这种情况下,你确实会接到一个呼叫
sceneDidEnterBackground
。@rmaddy好吧,这是我在另一个回答中关注的一个奇怪的人出场景:一个有场景支持但关闭了多个窗口的应用程序,在iPad上运行。是的,我想到了willResignActive。我担心的是这种情况经常发生。打开通知中心,您会收到两次通知。不过,有趣的是,这证实了我自己开始得出的结论。