Я обновил модель существующего приложения для iPhone несколькими простыми способами (удалить атрибут, добавить атрибут, удалить индекс) и могу использовать автоматическую облегченную миграцию для миграции постоянного хранилища.
Из-за типичного размера набора данных время обработки немаловажно и требует обратной связи от пользователя.
NSMigrationManager
предоставляет простое, но полезное migrationProgress
значение, которое отправляет уведомления KVO по мере выполнения миграции. Это составляет основу обратной связи, однако попытка использовать предполагаемую модель ([NSMappingModel inferredMappingModelForSourceModel:destinationModel:error:]
) приводит к совершенно разным временным характеристикам для одного и того же набора данных.
Результаты профиля на исходном iPhone (2 ГБ), размер кеш-памяти: 1,785 МБ на диске.
Автоматическая предполагаемая упрощенная миграция
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:
Предполагаемый перенос вручную
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:
Таким образом, с предполагаемой моделью перенос вручную занимает в 5 раз больше времени, чем автоматический!
ОБНОВЛЕНИЕ: загрузка модели
Документация Core Data для _6 >> noreferrer ">" Варианты переноса " говорит:
NSInferMappingModelAutomaticallyOption
... координатор попытается вывести модель отображения, если ее не удастся найти.
И именно поэтому построенная, скомпилированная и объединенная модель сопоставления XCode должна быть удалена (или просто не настроена на таргетинг), чтобы произошла предполагаемая и облегченная миграция.
Это большая несогласованность, и параметр облегченный, который NSPersistentStoreCoordinator -addPersistentStoreWithType:configuration:URL:options:error:
не дает абсолютно никакой индикации прогресса во время обработки.
Может ли кто-нибудь предоставить поддерживаемый способ получения значений migrationProgress
во время автоматической миграции, ИЛИ способ настроить предполагаемую модель сопоставления на такую же скорость при ручной обработке, как и при автоматической?
ОБНОВЛЕНИЕ: отчет об ошибке
Поговорили с инженерами WWDC, и они попросили отчет об ошибке с запросом migrationProgress
для автоматической обработки облегченной миграции.
Я обновлю еще раз, если API обновится, чтобы добавить отчеты о ходе выполнения ..