大量のデータをインポートできるCoreDataを使用したドキュメントベースのCocoaアプリがあります。このインポートには時間がかかるため、バックグラウンドで実行しますが、NSManagedObjectContext
スレッド保存ではないため、ドキュメントののをpersistentStoreCoordinator
使用して、バックグラウンドスレッドで新しいインポートを作成しました。ここで、インポートが終了したら、バックグラウンドを保存して、ドキュメントのメインスレッドに変更を通知し、それらをマージします。私が理解している限り、これはCoreDataを使用して同時実行を行うことになっている方法です。managedObjectContext
NSManagedObjectContext
managedObjectContext
managedObjectContext
ただし、呼び出し時にpersistentStoreCoordinator
がない場合があります。これにより、保存が失敗し、アプリがクラッシュします。私は自動保存とすべて(基本的にOS X 10.8ではほとんど変更されていないNSPersistentDocument)を使用しているので、保存方法を気にする必要はなく、「正しく機能する」と思いました。persistentStore
[managedObjectContex save:]
どうやら、これはそうではありません。[self autosaveDocumentWithDelegate:self didAutosaveSelector:@selector(document:didAutosave:contextInfo:) contextInfo:nil];
ドキュメントサブクラスの最後で呼び出すことによってpersistentStoreが作成されることを期待して、自動保存操作を強制しようとしましたwindowControllerDidLoadNib:
が、これは何も変更されていないようです。デリゲートコールバック(- (void)document:(NSDocument *)document didAutosave:(BOOL)didAutosaveSuccessfully contextInfo:(void *)contextInfo
)は、実際には自動保存が成功したことを示していますが、fileURLまたは関連するアクセサーのいずれもnil以外のものを返したり、persistentStoreが作成されたりしていません。
自分自身を呼び出すことも考えまし-(BOOL)configurePersistentStoreCoordinatorForURL:(NSURL *)url ofType:(NSString *)fileType modelConfiguration:(NSString *)configuration storeOptions:(NSDictionary *)storeOptions error:(NSError *__autoreleasing *)error
たが、通常の自動保存と同じように動作させるためにどのURLを使用すればよいかわかりません。を確認backupFileURL
しましたが、の最後fileURL
でautosavedContentsFileURL
はまだすべてゼロですwindowControllerDidLoadNib:
。実際のところ、それらは後でゼロにwriteToURL:...
なり、configurePersistentStoreCoordinatorForURL:...
呼び出されたので、「正しい」URLを取得する方法がわかりません。
いつどのようにpersistentStoreが作成されるかをよりよく理解するために、とにwriteToURL:...
ブレークポイントを設定しましたconfigurePersistentStoreCoordinatorForURL:...
。configurePersistentStoreCoordinatorForURL:
アプリケーションが最前線のステータスを失ったときに呼び出されることに気づきました。しかし、新しいドキュメントを作成し、作成直後に何かをインポートしようとすると(最初に別のアプリに切り替えてpersistentStoreを作成せずに)、クラッシュします。別のアプリに切り替えると、ストアが作成され、すべてが正常に機能します。ちなみに、この方法で作成されたpersistentStoreに使用されるURLは、常にtempディレクトリのどこかにあります。
私は何か間違ったことをしていますか?[managedObjectContext save:]を呼び出して、他のmanagedObjectContextに変更を通知する必要はありませんか?ドキュメントに一時的なpersistentStoreを作成させるにはどうすればよいですか?autosaveDocumentWithDelegate:...
ドキュメントを実際に保存する(したがって、を作成するpersistentStore
)ための呼び出しが行われないのはなぜですか?
関連している:
- 新しいプロジェクト新しいモデルNSPersistentDocumentこのNSPersistentStoreCoordinatorには永続ストアがありません同様の問題がありますが、解決策はコンテキストを保存しないか、エラーを表示することでした。2番目の変更を通知するためにコンテキストを保存する必要があり、ユーザーにファイルを手動で保存するように強制したくないと思います(結局のところ、それが自動保存の目的です)。