iOS:在 applicationWillTerminate 上为数据持久性序列化对象有多安全?序列化不会完成的任何机会?
Posted
技术标签:
【中文标题】iOS:在 applicationWillTerminate 上为数据持久性序列化对象有多安全?序列化不会完成的任何机会?【英文标题】:iOS: How safe is serializing objects for data persistence on applicationWillTerminate? Any chance that the serialization will not complete? 【发布时间】:2011-07-11 13:27:46 【问题描述】:我了解您通常使用 applicationWillTerminate 上的 NSCoder 协议序列化对象以实现数据持久性。这种序列化是否有可能无法完成? IE。电池快没电了,所以app退出了,在序列化完成之前,电池完全没电了。
我正在创建一个应用程序,其中涉及用户添加新对象(如财务记录)的过程。因此,无法序列化对象会很烦人,因为重新创建该对象会有点耗时。因此,我应该在用户单击“保存”按钮后立即进行序列化,还是可以确定序列化将在 applicationWillTerminate 上完成 99.9% 的时间?
类似地,如果我将此数据同步到服务器,我的应用是否有足够的时间在 applicationDidEnterBackground 上进行同步?
【问题讨论】:
【参考方案1】:对于不选择退出多任务处理的应用程序(通过在 Info.plist 中将 UIApplicationExitsOnSuspend
设置为 YES
),applicationWillTerminate:
不会总是被调用,您应该在 applicationDidEnterBackground:
中进行序列化。
最大的风险是您的序列化时间过长,并且看门狗守护程序会在您的应用程序完成之前杀死它。如果您的序列化时间超过 5 秒,就会发生这种情况,如果您序列化大型对象,这很可能会发生。
【讨论】:
我要补充一点,最好在数据出现时序列化数据,除非你有理由不这样做。这完全是关于您的数据的敏感性与您的应用程序的性能。 (应用运行时节省了多少时间,应用关闭时节省了多少时间。) @omz:你能告诉我什么是“大物体”吗?我的对象通常是其他对象的数组。而那些“其他对象”可能会有 10 条数据——主要是字符串,但也有一张图像。我想这些数组最多可以容纳大约 100 个这种性质的对象。 @Moshe:我意识到,当时机成熟时,性能测试将非常有帮助(即,如果每次添加新对象时重新序列化我的一个数组需要多长时间它)。 仍然希望了解什么是“大”物体。 对此没有明确的答案。您必须测试序列化对象需要多长时间;这不仅取决于它的纯大小,还取决于它的序列化方式。例如,JPEG 图像在写入磁盘时可能很小,但用于压缩的 CPU 成本很高。另一个需要考虑的重点是您的对象是否(或多或少)都相同,或者是否存在需要序列化的数据明显更多的情况(用户输入?)。以上是关于iOS:在 applicationWillTerminate 上为数据持久性序列化对象有多安全?序列化不会完成的任何机会?的主要内容,如果未能解决你的问题,请参考以下文章
iOS 纵横比约束在 iOS 7 上中断,适用于 iOS 8