核心数据迁移启动需要多长时间?
Posted
技术标签:
【中文标题】核心数据迁移启动需要多长时间?【英文标题】:How long can core data migration take on startup? 【发布时间】:2014-01-20 13:01:03 【问题描述】:我看到我的 iPad 上的 4Gb 数据库在应用程序启动时成功完成核心数据迁移需要几分钟时间。 现在突然间,一些用户在安装新版本后报告崩溃,应用程序被踢出并显示:未能及时启动错误。
我刚刚通过恢复旧数据库再次进行了测试,我确信核心数据迁移可能需要 10 秒以上的时间。
但其他人担心它不应该并尝试将其带到后台,或者至少在启动时退出运行循环:
iPhone app launch times and Core Data migration
这是否与其他条件有关,例如连接到电源?或者电池电量超过 50%?
更新:我只是通过在设备上启动应用程序(拔下电源)而不是调试来重现崩溃。 然后我尝试在连接了 USB 的设备上启动应用程序:崩溃。 然后通过调试器启动应用程序:没有崩溃(迁移大约需要 4 分钟。)
额外信息:我只有企业用户(大约 75 个),他们都有一个 4.5Gb 的数据库。有些用户升级没有问题,有些用户有。如果成功,升级都需要几分钟。崩溃总是在 20 秒后发生。 (如果您在这些设备上再次尝试,它们会继续崩溃)。
我按照建议将迁移置于运行循环之外,但我仍然想知道为什么旧方法适用于某些设备而不适用于其他设备。所有用户都使用 ios 7。
【问题讨论】:
这真的取决于设备本身和应用程序的可用资源,例如内存,处理器功率等。但我建议在后台处理迁移,不要在 10 秒启动上限内运行。 【参考方案1】:这是一个常见的启动问题。 Core Data 迁移可能需要 0 到 N 的任意时间,具体取决于模型的复杂性、数据量以及发生的迁移类型。
理想情况下,您不应该在 -applicationDidFinish...
方法中创建核心数据堆栈,迁移是原因之一。
我的建议是重新设计您的启动,以便在堆栈初始化之前显示一些内容。这可能只是您在视图中的默认图像。然后,当 Core Data 堆栈初始化后,您可以切换到完整的视图控制器堆栈。
我还建议您更进一步,以便您可以告诉用户迁移正在进行中,并且我会进一步将迁移放在后台队列中,以便您可以在迁移发生时更新 UI。
最后,如果您正在进行大量迁移,我会考虑进行轻量级迁移。轻量级迁移要快得多,还有其他好处。
【讨论】:
您在新版本的书中有一些代码示例来提供您的一些建议吗?我确实购买了第一个版本(您在布莱顿会议上签名了 :-),并且想知道购买第二个版本是否会给我带来任何好处。 有一些代码示例(您可能可以从该站点下载)随着对 CD 堆栈的改进而有所不同。在 V2 中有关于该代码的讨论。这个具体的示例不在其中,但可能很快就会以某种形式出现:)【参考方案2】:如果您查看崩溃日志,它可能会说应用程序已被终止,因为启动时间过长。看门狗进程会杀死启动时间过长的应用程序 - 我认为 > 20 秒。这是因为核心数据迁移过程是在应用启动期间运行的。
我建议您在后台手动运行迁移。以下关于 Core Data 的新书包含有关如何进行后台手动迁移的代码和说明。
http://www.amazon.com/gp/aw/d/0321905768
【讨论】:
我一定会看这本书的。尽管我已经遵循了我提到的线程的建议。只是没有更新 UI 来告诉迁移正在进行中。然而,我的问题仍然是为什么这在过去没有问题。 我也遇到过同样的情况。我能够在启动时进行手动迁移而没有任何问题,然后在一个版本中,我在测试期间开始出现这些崩溃,因此我需要开始在后台运行迁移。过去迁移可能在允许的启动时间内(20 秒)内完成,但现在没有,因为您有更多数据或迁移更复杂。【参考方案3】:这不是不在后台线程上运行迁移的规则,而是一个建议,因为如果您在后台线程上运行并且您的应用程序开始运行,则不能保证您的核心数据堆栈不会接触。
您可以将此迁移从 didFinishLaunching 中移除,但请确保该堆栈没有被触及。您可以通过一些检查来处理此问题,例如放置 viewController
并带有应用程序正在更新的消息,该消息不允许用户执行任何操作,同时您可以执行后台迁移。迁移过程完成后,您可以简单地关闭 viewController
将用户带回家 viewController
。
当您的应用在 iOS 平台上运行时,您无法保证所有事情,例如,如果原生应用需要更多内存,那么内存会从您的应用配额中切断,并且可能会被一些有线杀死。
【讨论】:
以上是关于核心数据迁移启动需要多长时间?的主要内容,如果未能解决你的问题,请参考以下文章