すべて同じNSManagedObjectContextで動作するさまざまなコントローラーを備えたアプリケーションがあります。
私のアプローチは、AppDelegateでNSManagedObjectContextを初期化し、それをすべてのコントローラーに挿入することでした。
次のようにUIManagedDocumentを開いて、NSManagedObjectContextを初期化しています。
UIManagedDocument* databaseDoc = [[UIManagedDocument alloc] initWithFileURL:url];
if (![[NSFileManager defaultManager] fileExistsAtPath:[databaseDoc.fileURL path]]) {
[databaseDoc saveToURL:databaseDoc.fileURL forSaveOperation:UIDocumentSaveForCreating completionHandler:^(BOOL success) {
myController.managedObjectContext = databaseDoc.managedObjectContext;
}];
} else if (databaseDoc.documentState == UIDocumentStateClosed) {
[databaseDoc openWithCompletionHandler:^(BOOL success) {
myController.managedObjectContext = databaseDoc.managedObjectContext;
}];
} else if (databaseDoc.documentState == UIDocumentStateNormal){
myController.managedObjectContext = databaseDoc.managedObjectContext;
}
ここでの私の問題は、UIManagedDocumentを開くことが非同期で行われ、NSManagedObjectContextが完了ブロックでのみ使用可能になることです。
コントローラが常に有効なNSManagedObjectContextを使用できるようにするにはどうすればよいですか?もちろん、問題は起動時に発生します。つまり、コントローラーが「viewDidLoad」メソッドでNSManagedObjectContextを使用する必要があり、AppDelegateの完了ブロックがまだ実行されていない場合です...
1つのアプローチは、おそらくUIDocumentが開くまでAppDelegateで「待機」することですが、私が収集する限り、これはお勧めできません...
NSManagedObjectContextを開く非同期の性質を処理するコードでコントローラーを「汚染」することは避けたいのですが...これは単純な願いですか?