いくつかの簡単な方法 (属性の削除、属性の追加、インデックスの削除) で既存の 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:
手動の推定移行
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 倍以上の時間がかかります!
更新: モデルの読み込み
「移行オプション」のコアデータのドキュメントには、次のように記載されています。NSPersistentStoreCoordinator
NSInferMappingModelAutomaticallyOption
... マッピング モデルが見つからない場合、コーディネーターはマッピング モデルを推測しようとします。
そのため、XCode でビルド、コンパイル、およびバンドルされたマッピング モデルを削除 (または単に対象外) にして、推論された軽量の移行を実行できるようにする必要があります。
これは大きな矛盾であり、処理中の進行状況をまったく示さない軽量オプションです。NSPersistentStoreCoordinator -addPersistentStoreWithType:configuration:URL:options:error:
migrationProgress
自動移行中に値を取得するサポートされている方法、または手動処理中に自動と同じくらい高速になるように推論されたマッピングモデルを構成する方法を誰かが提供できますか?
更新: バグレポート
WWDC のエンジニアに話を聞いたところ、migrationProgress
軽量の自動移行処理を要求するバグ レポートを求められました。
進捗レポートを追加するために API が更新された場合は、もう一度更新します。