当 iphone 应用程序进入后台或前台状态时,如何保存数据?

Posted

技术标签:

【中文标题】当 iphone 应用程序进入后台或前台状态时,如何保存数据?【英文标题】:How do you save data when the iphone app goes to background or foreground state? 【发布时间】:2015-03-24 14:57:19 【问题描述】:

我有一个应用程序,用户可以在其中输入某些信息。每次用户想要时,他都会在表格列表中添加一个新项目。当用户完成后,他们点击 finalize 按钮完成列表,他们可以开始另一个列表。

AppDelegate.swift 文件中,我看到了一些预先存在的函数。 applicationDidEnterBackground 说在应用程序进入后台之前保存信息(我假设是当用户在使用应用程序时按下主页按钮时......)。

在我的应用程序中,每次用户将项目添加到列表中,然后转到主屏幕并锁定手机,一段时间后项目就消失了。所以他们添加的信息不会保存。我正在考虑使用AppDelegate.swift 中的函数来保存信息并在每次应用程序最小化或最大化时加载信息。我的问题是,保存这些信息的最佳方法是什么?我只是写入文件并从文件中读取,还是有办法自动保存和加载这些信息?我读过一些关于将对象保存到.plist 的内容,但我不一定知道它是如何工作的,因为当我单击info.plist 时,它只会将我带到设置表而没有代码。

提前感谢您的帮助!

【问题讨论】:

【参考方案1】:

免责声明:我是一位经验丰富的 Objective-C 开发人员,但对 Swift 还是很陌生。我的答案将是面向 Objective-C 的。

你有很多选择。另一张海报建议使用 Core Data,但除非您有复杂的信息要保存,否则这可能是矫枉过正。 Core Data 是一个庞大而复杂的框架,具有陡峭的学习曲线。它非常强大,但需要花一两个星期的时间进行深入研究,然后才能流畅地使用它。

最简单和最干净的方法通常是使用NSUserDefaults。它是一个 Cocoa 类,可将键/值对读/写到应用沙箱中系统维护的文件中。 (本质上是一个自动读/写到系统文件的字典。)你不需要知道它是如何工作的细节——它只是工作。有关更多信息,请参阅 NSUserDefaults 上的 Xcode 文档。

另一个选择确实是使用属性列表。像 NSArray 和 NSDictionary 这样的 Cocoa 容器对象包括将自身保存到/从属性列表读取的方法。寻找像writeToFile:atomically: 这样的方法。

为了同时保存到 NSUserDefaults 和属性列表,您保存的对象以及它包含的任何对象(如果它是容器对象)必须是一个非常短的“属性列表”对象列表(字典、数组)的成员、字符串、数字(整数和浮点数)、日期、二进制数据和布尔值。)在 Xcode 文档中搜索“属性列表类型和对象”以获取有关属性列表和支持的数据类型的更多信息。

第三种选择是在所有要保存的对象(整个“对象图”)中实现 NSCoding 协议,然后使用 NSKeyedArchiver 方法 @987654323 将根对象(通常是容器对象)保存到磁盘@

通过所有这些选项,您可以实现应用程序委托方法applicationDidEnterBackground,并在调用时保存您的状态数据。然后,您将在 applicationDidFinishLaunching 方法中重新加载数据。 (当您返回前台时,您不需要将保存的状态数据加载回来,因为如果您正在返回前台,您的应用仍在运行,并且它的状态数据仍在内存中。)

各种 Cocoa 触摸类还包括对自动状态恢复的支持,但这超出了我在此介绍的内容。

【讨论】:

感谢您提供所有这些选项!!!这非常有用,并且在很大程度上回答了我的问题。我倾向于NSUserDefaults,并且即将对其进行一些研究。我真正需要保存的只是一个对象。这是该对象的层次结构:MainObject 包含 SecondaryObject 和日期/时间,然后 SecondaryObject(位于 MainObject 内)包含用户在 tableview 中输入的项目列表。 如果我的回答解决了您的问题,请接受它,如果您认为这是一个好的答案,请考虑对其进行投票。 (显然是你的电话) 已经接受:),根据我上面的评论,你认为我可以使用NSUserDefaults 保存MainObject 并且它会保存其余数据,因为该数据在该对象中? 您无法将自定义对象保存到 NSUserDefaults。您只能保存我的答案中列出的“属性列表对象”。如果要保存自定义对象,则该对象必须符合 NSCoding 协议。如果您的 MainObject 需要保存的属性数量有限,那么您可以简单地编写保存和加载方法,将这些属性中的每一个作为单独的键/值对保存到用户默认值。 MR04 问:“我能保存一个结构数组吗?”答案是不。只有“属性列表”对象的简短列表可以保存到 NSUserDefaults 或 plist。 Swift 结构不是这些东西。【参考方案2】:

我建议使用核心数据进行数据持久化

请转至ray wenderlich tutorial for core data

【讨论】:

以上是关于当 iphone 应用程序进入后台或前台状态时,如何保存数据?的主要内容,如果未能解决你的问题,请参考以下文章

当应用程序进入前台时,哪个View Controller处于活动状态?

iPhone 应用程序在从后台进入前台时会挂起/阻止 UI 几秒钟

当应用程序进入后台时,在前台执行的长时间运行的任务被挂起

当应用程序进入暂停状态时取消本地通知。(从后台删除)

快速检测应用程序是在后台还是前台

当 Apple Watch 处于后台状态或睡眠模式时,我们如何从 iphone 向 Apple Watch 发送消息?