gpt4 book ai didi

ios - 核心数据内存高效迁移

转载 作者:行者123 更新时间:2023-11-29 12:36:32 25 4
gpt4 key购买 nike

我目前正在为一个应用程序构建 CoreData 迁移,每个实体平均有 20 万/50 万行数据。 CoreData 模型中目前有 15 个实体。

这是我为此应用程序构建的第 7 次迁移,之前的所有迁移都是简单的(添加 1 或 2 列样式)迁移,没有任何问题,也不需要任何映射模型。

这次迁移

与之前的迁移相比,我们正在进行的迁移规模相当大,并在两个现有实体之间添加了一个新实体。这需要我们构建的自定义 NSEntityMigrationPolicy 来映射新的实体关系。我们还有一个 *.xcmappingmodel,它定义了模型 6 和新模型 7 之间的映射。

我们已经实现了自己的 NSMigrationManager 子类(根据 http://www.objc.io/issue-4/core-data-migration.html + http://www.amazon.com/Core-Data-Management-Pragmatic-Programmers/dp/1937785084/ref=dp_ob_image_bk )。

问题

Apple 使用 NSMigrationManager 的 migrateStoreFromURL 方法来迁移模型,但是,这似乎是为低/中数据集大小构建的,不会使内存过载。

我们发现应用程序因内存过载(在 iPad Air/iPad 2 上为 500-600mb)而崩溃,这是由于以下苹果方法不经常在数据传输时转储内存。

[manager migrateStoreFromURL:sourceStoreURL type:type options:nil withMappingModel:mappingModel toDestinationURL:destinationStoreURL destinationType:type destinationOptions:nil error:error];

Apple 建议的解决方案

Apple 建议我们应该将 *.xcmappingmodel 分成一系列每个实体的映射模型 - https://developer.apple.com/library/ios/documentation/cocoa/conceptual/CoreDataVersioning/Articles/vmCustomizing.html#//apple_ref/doc/uid/TP40004399-CH8-SW2 .这将与上述 NSMigrationManager 子类中定义的 progressivelyMigrateURL 方法一起工作。但是,我们无法使用此方法,因为单独的实体仍会由于一个实体本身的大小而导致内存过载。

我的猜测是我们需要编写自己的 migrateStoreFromURL 方法,但希望尽可能接近 Apple 的预期。以前有没有人这样做过和/或对我们如何实现这一点有任何想法?

最佳答案

简短的回答是,大量迁移对 iOS 不利,应该不惜一切代价避免。它们从未设计用于内存受限的设备。

话虽如此,在我们讨论解决方案之前,请问您几个问题:

  1. 数据是否可恢复?能重新下载吗还是这个是用户数据?

  2. 您能否在没有旧关系的情况下解决实体之间的关系?能否重构?

我有一些解决方案,但它们依赖于数据,因此问题会返回给您。

更新1

The data is not recoverable and cannot be re-downloaded. The data is formed from user activity within the application over a time period (reaching up to 1 year in the past). The relationships are also not reconstructable, unless we store them before we lose access to the old relationships.

好的,您所描述的是最坏的情况,因此也是最困难的情况。幸运的是,它并非无法解决。

首先,大量迁移是行不通的。我们必须编写代码来解决这个问题。

第一个选项

我的首选解决方案是进行轻量级迁移,仅添加(现在)三个实体之间的新关系,而不会删除旧关系。这种轻量级迁移将在 SQLite 中进行,并且速度非常快。

迁移完成后,我们将遍历对象并根据旧关系设置新关系。这可以作为后台进程完成,也可以在使用对象时一次性完成,等等。这是一个业务决策。

转换完成后,如果需要,您可以进行另一次迁移以删除旧关系。此步骤不是必需的,但它确实有助于保持模型清洁。

第二个选项

另一个有值(value)的选项是导出并重新导入数据。这具有设置代码以在其他平台上可读的格式备份用户数据的附加值。将数据导出到 JSON,然后设置一个导入例程,将数据连同新关系一起拉入新模型非常简单。

第二个选项的优点是更简洁,但需要更多代码以及用户事件中的“暂停”。第一个选项可以在用户甚至不知道正在发生迁移的情况下完成。

关于ios - 核心数据内存高效迁移,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26182152/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com