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

Posted

技术标签:

【中文标题】在 iOS 13 中,何时保存数据?【英文标题】:In iOS 13, when to save data? 【发布时间】:2019-10-26 01:12:08 【问题描述】:

ios 13 中的场景支持和多个窗口使何时保存数据的问题变得复杂。场景代表的sceneDidEnterBackground 可能看起来不错,但有时它还不够:

如果您的场景位于最前面并且用户转到应用切换器并终止您的应用,您将获得sceneDidDisconnectapplicationWillTerminate,而不是sceneDidEnterBackground

如果用户在您的应用位于最前面时关闭设备,您将获得applicationWillTerminate,而不是sceneDidEnterBackground

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

【问题讨论】:

这是第三种情况:用户打开了您的应用程序的多个场景(每个全屏)。在前景中查看其中一个全屏场景时,如果他们随后切换到应用程序切换器并将最近的场景滑出屏幕顶部,则该场景确实会调用其sceneDidEnterBackground。应用程序未终止,因为还有另一个场景(当前在后台)。 我的意思是“做”,我的意思不是“不做”。运行您的应用程序。得到它,所以两个场景并排显示在屏幕上。将分隔线滑动到屏幕边缘,使一个场景全屏显示。当然,另一个进入后台,并为那个调用 sceneDidEnterBackground。现在双击主页按钮以调出应用程序切换器。你看这两个场景。如果您在前景中滑动刚刚离开的场景,该被杀死的场景现在将调用其sceneDidEnterBackground。至少我的应用是这样的。 @rmaddy 好吧,我发现这非常令人困惑,不仅因为我在模拟器和设备上得到不同的结果,还因为使用 OSLog 进行控制台穴居人调试并不完全可靠。用户在应用切换器中向上滑动我们的情况非常困难,因此我在这里为它创建了一个单独的问答:***.com/questions/58573015/… 如果我正确阅读了您对其他问题的回答(这与我所看到的以及我在之前的 cmets 中发布的内容相匹配),那么这不是您在这个问题中的第一个要点不正确?事实上,在那种情况下,你确实会接到 sceneDidEnterBackground 的电话(和 applicationWillTerminate)。 @rmaddy 好吧,事实证明这是我在另一个答案中关注的奇怪场景:一个具有场景支持但关闭多个窗口的应用程序,在 iPad 上运行。 【参考方案1】:

来自UISceneDelegate.sceneWillResignActive(_:) 的文档:

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

他们还在UISceneDelegate.sceneDidDisconnect(_:) 的文档中声明:

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

所以看起来 Apple 建议我们在事件发生时保存用户数据,例如响应用户执行某项操作(关闭视图控制器、切换开关、在文本字段中输入文本等),但我们可能会如果我们需要或想要,使用sceneWillResignActive(_:) 和/或sceneDidDisconnect(_:) 保存一些数据。

【讨论】:

是的,我想到了 willResignActive。我担心的是这种情况来得太频繁了。打开通知中心你会得到两次。不过,有趣的是,这证实了我自己开始得出的结论。

以上是关于在 iOS 13 中,何时保存数据?的主要内容,如果未能解决你的问题,请参考以下文章

在 iOS 中保存 JSON 对象

选择何时何地在本地保存数据[关闭]

FCM 令牌 - 我应该何时将其存储/保存在我的数据库中?

代码中哪里是保存核心数据的最佳位置?

检测 iOS UICollectionCell 何时离开屏幕

如何知道文本字段何时更改而不保存