核心数据推断迁移 - 自动"轻量级"与手动

ohh*_*rob 10 migration iphone core-data objective-c mapping-model

我已经以一些简单的方式更新了现有iPhone应用程序的模型(删除属性,添加属性,删除索引),并且可以使用自动轻量级迁移来迁移持久性存储.

由于数据集的典型大小,处理时间并不是无关紧要的,并且需要为用户提供反馈.

NSMigrationManager提供了一个简单但有用的migrationProgress值,可在执行迁移时发送KVO通知.这构成了提供反馈的基础,但是尝试使用推断的模型([NSMappingModel inferredMappingModelForSourceModel:destinationModel:error:])导致完全相同的数据集的时序截然不同.

原始iPhone(2G)上的配置文件结果,磁盘上的缓存大小:1.785 MB.

自动推断轻量级迁移

PROFILE: CacheManager -migrateStore
PROFILE:   0.6130 (+0.6130) models loaded
PROFILE:   1.1759 (+0.5629) delegate -CacheManagerWillMigrate:
PROFILE:   1.2516 (+0.0757) persistent store coordinator loaded
PROFILE:   5.1436 (+3.8920) automatic lightweight migration completed
PROFILE:   5.5435 (+0.3999) delegate -CacheManagerDidFinishMigration:withError:
Run Code Online (Sandbox Code Playgroud)

手动推断迁移

PROFILE: CacheManager -migrateStore
PROFILE:   0.6660 (+0.6660) models loaded
PROFILE:   1.1471 (+0.4811) inferred mapping model generated
PROFILE:   1.4046 (+0.2574) delegate -CacheManagerWillMigrate:
PROFILE:   1.5058 (+0.1013) persistent store coordinator loaded
PROFILE:   22.6952 (+21.1894) manual migration completed
PROFILE:   23.1478 (+0.4525) delegate -CacheManagerDidFinishMigration:withError:
Run Code Online (Sandbox Code Playgroud)

因此,使用推断模型,手动迁移所需的时间比自动迁移长5倍!


更新:模型加载

"迁移选项"的核心数据文档说:NSPersistentStoreCoordinator

NSInferMappingModelAutomaticallyOption

...如果找不到任何映射模型,协调器将尝试推断映射模型.

这就是为什么必须删除XCode构建,编译和捆绑的映射模型(或者只是取消目标)以允许推断轻量级迁移发生的原因.


这是一个很大的不一致性,轻量级选项NSPersistentStoreCoordinator -addPersistentStoreWithType:configuration:URL:options:error:在处理过程中绝对没有任何进度指示.

任何人都可以提供migrationProgress在自动迁移期间获取值的支持方式,或者在手动处理期间将推断的映射模型配置为与自动一样快的方式?


更新:错误报告

向WWDC的工程师发表讲话,他们要求提供错误报告,要求migrationProgress进行自动轻量级迁移处理.

如果更新API以添加进度报告,我将再次更新..

Mar*_*rra 2

当您自己定义映射模型而不是使用推断模型时会发生什么?听起来推断模型的创建会导致性能下降,直接定义映射模型并将其包含在项目中可以解决这一问题。

更新

我已经尝试过该策略,并且使用 XCode 中生成的映射模型会产生与运行时推断模型大致相同的处理时间。唯一真正的区别是从捆绑包加载模型的时间比运行时推断的时间稍快。此外,一旦映射模型捆绑在应用程序中,自动迁移就不再是轻量级的,我假设它正在使用捆绑模型。从目标中删除映射模型使自动轻量级的处理时间恢复到约 4 秒

这当然是违反直觉的。您的项目是否足够简单,可以作为这种低效率的示例发布,或者您是否有一个测试项目来隔离此问题?无论哪种情况,看一下它都会非常有帮助,这样我们就可以 A) 希望解开这个谜团;或 B)将其作为一个相当大的错误向 Apple 提交,因为相反的情况肯定应该如此。

您正在使用的数据集有多大?