2011-01-18 6 views
2

データが豊富なアプリケーションがあり、XCodeのビジュアルマッピングモデルとクリーンアップコードのNSEntityMigrationPolicy実装を使用して、CoreDataのすべての移行処理を実装しました。実際のデバイス上での移行は実際には時間がかかるため、完了までに最大で5分かかることがあります。自動移行でNSMigrationManagerへの参照を取得する最速の方法は?

これが起こっているときに私は実際にユーザーにフィードバックを与え、NSMigrationManagerのmigrationProgress属性をKVOにしたいと考えています。そのトリックは、addPersistentStoreWithType:configuration:URL:options:error:は、マイグレーションが必要であると判断した場合にNSMigrationManagerへの参照を取得させないということです。

カスタムNSEntityMigrationPolicyにbeginEntityMapping:manager:error:コールバックを実装してNSMigrationManagerへの参照を取得できることが判明しました。

唯一の問題は、(また、この30%は、典型的には約半分合計時間を表しaddPersistentStoreWithTypeへのコールの内側に過ごしたあなたはbeginEntityMappingコールに着くまでに、進捗状況は約30%までのようだということですだから実際はそれよりも悪いと思う)。

NSMigrationManagerへの参照を手掛かりにするために使うことができる技を知っている人は誰もいないので、ユーザにフィードバックを与える機会の最初の3分の1を逃す必要はありませんなぜアプリケーションが起動するまでに時間がかかるのですか?

ありがとうございました!

答えて

0

この問題を回避するためのもう1つの方法を見つけることができず、the documentationとして、完全に手動で起動されたaddPersistentStoreWithType:configuration:URL:options:error:の使用を停止しました。それは(あなたが本当にはるかに容易に移行を持っているしたい)YESなら、あなたは何を得る

NSMigrationManager *migrationManager = [[NSMigrationManager alloc] initWithSourceModel:sourceModel 
                     destinationModel:destinationModel]; 

//if it's set to NO, we can't migrate due to too much memory 
//if it's set to YES (the default), we get no progress reporting!! 
//migrationManager.usesStoreSpecificMigrationManager = NO; 

NSError *mappingError; 
NSMappingModel *mappingModel = [NSMappingModel inferredMappingModelForSourceModel:sourceModel 
                   destinationModel:destinationModel 
                      error:&mappingError]; 

NSPersistentStore *persistentStore; 
NSError *addPersistentStoreError; 
if (mappingModel) { 

    NSError *migrationError; 
    BOOL migrationSuccess = [migrationManager migrateStoreFromURL:sourceStoreURL 
                  type:NSSQLiteStoreType 
                  options:nil 
               withMappingModel:mappingModel 
               toDestinationURL:destinationStoreURL 
                destinationType:NSSQLiteStoreType 
               destinationOptions:nil error:&migrationError]; 

しかし-usesStoreSpecificMigrationManager

の特別な注意を取る:

+1

軽いマイグレーションで実際にはうまくいくのですか?推測マッピングを使用した「手動」マイグレーションを実装しましたが、事実上軽量マイグレーションですが、進歩は常に0.0。(成功したmiの後でさえgration) –

+1

iOS 6についてはわかりませんが、iOS 5以前では、軽量移行による進捗状況についてのフィードバックは得られません。かなり悪いですし、あなたができる最善の方法は、事前にプロファイリングし、DBのサイズに基づいていくつかの見積もりを得て、それから進捗状況をシミュレートすることです。しかし、それは実際の進歩ではなく、単なる見積もりではありません。 – glenc

+1

iOS6でテストしましたが、NSMigrationManagerを使用して手動で移行を開始すると、 "migrationProgress"は常に0.0になります。 "-addPersistentStoreWithType:..."についてはわかりませんが、あなたが指摘しているように、この場合は移行マネージャへの参照を実際に取得できません。 –

0

次のようなコードでそれを行うことはできません(

関連する問題