我已经看到我的iPad上的4Gb数据库在应用程序启动时成功进行了核心数据迁移需要几分钟。 现在突然,一些用户在安装新版本后报告了崩溃,并且应用程序被踢出了:无法及时启动错误。
我刚刚通过恢复旧数据库再次测试,我确信核心数据迁移可能会超过10秒。
但是其他人担心它不应该并且尝试将它带到后台,或者至少在发布时从运行循环开始:
iPhone app launch times and Core Data migration
这与其他条件有什么关系,例如连接电源?或者电池电量超过50%?
更新:我通过启动设备上的应用程序(拔掉插头)而不是调试来重现崩溃。 然后我尝试在连接USB的设备上启动应用程序:崩溃。 然后通过调试器启动应用程序:没有崩溃(迁移大约需要4分钟。)
额外信息:我只有企业用户(大约75个),他们都有4.5Gb的数据库。有些用户升级没问题,有些用户有。如果成功,升级都需要几分钟。崩溃总是在20秒后发生。 (如果再次尝试使用这些设备,它们会继续崩溃)。
我按照建议将迁移放在了运行循环之外,但我仍然想知道为什么旧方法适用于某些设备而不适用于其他设备。所有用户都在iOS 7上。
答案 0 :(得分:6)
这是常见的发布问题。核心数据迁移可能需要任意时间,0到N,具体取决于模型的复杂程度,数据量和迁移类型。
理想情况下,您不应该使用-applicationDidFinish...
方法创建核心数据堆栈,迁移是其中一个原因。
我的建议是重新启动你的启动,以便在堆栈初始化之前显示一些内容。这可能只是视图中的默认图像。然后,当Core Data堆栈初始化时,您可以切换到完整视图控制器堆栈。
我还建议您进一步了解这一点,以便告诉用户迁移正在进行中,我会进一步将迁移放在后台队列中,以便您可以在迁移过程中更新UI。 / p>
最后,如果您正在进行大量迁移,我会考虑进行轻量级迁移。轻量级迁移和其他好处要快得多。
答案 1 :(得分:1)
如果查看崩溃日志,可能会说该应用程序被杀,因为启动时间太长。看门狗进程会杀死需要太长时间启动的应用程序 - 我想是> 20秒。这是因为核心数据迁移过程是在应用启动期间运行的。
我建议您在后台手动运行迁移。以下关于核心数据的新书有关于如何进行后台手动迁移的代码和说明。
答案 2 :(得分:0)
这不是规则,不在后台线程上运行迁移,但它是一个建议,因为如果您在后台线程上运行并且您的应用程序开始运行,则无法保证您的核心数据堆栈不会触及。
您可以将此迁移从didFinishLaunching中移除,但请确保不触及堆栈。你可以通过一些检查来处理这个问题,例如放置一个viewController
,其中包含应用正在更新但不允许用户执行任何操作的消息,同时您可以执行后台迁移。迁移过程完成后,您可以简单地忽略viewController
将用户带回家viewController
。
当您的应用程序在iOS平台上运行时,您无法保证所有内容,例如,如果本机应用程序需要更多内存,那么内存将从您的应用程序配额中切断,并且可以获得一些有线杀戮。