3

大量のデータをインポートできるCoreDataを使用したドキュメントベースのCocoaアプリがあります。このインポートには時間がかかるため、バックグラウンドで実行しますが、NSManagedObjectContextスレッド保存ではないため、ドキュメントののをpersistentStoreCoordinator使用して、バックグラウンドスレッドで新しいインポートを作成しました。ここで、インポートが終了したら、バックグラウンドを保存して、ドキュメントのメインスレッドに変更を通知し、それらをマージします。私が理解している限り、これはCoreDataを使用して同時実行を行うことになっている方法です。managedObjectContextNSManagedObjectContextmanagedObjectContextmanagedObjectContext

ただし、呼び出し時に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しましたが、の最後fileURLautosavedContentsFileURLはまだすべてゼロですwindowControllerDidLoadNib:。実際のところ、それらは後でゼロにwriteToURL:...なり、configurePersistentStoreCoordinatorForURL:...呼び出されたので、「正しい」URLを取得する方法がわかりません。

いつどのようにpersistentStoreが作成されるかをよりよく理解するために、とにwriteToURL:...ブレークポイントを設定しましたconfigurePersistentStoreCoordinatorForURL:...configurePersistentStoreCoordinatorForURL:アプリケーションが最前線のステータスを失ったときに呼び出されることに気づきました。しかし、新しいドキュメントを作成し、作成直後に何かをインポートしようとすると(最初に別のアプリに切り替えてpersistentStoreを作成せずに)、クラッシュします。別のアプリに切り替えると、ストアが作成され、すべてが正常に機能します。ちなみに、この方法で作成されたpersistentStoreに使用されるURLは、常にtempディレクトリのどこかにあります。

私は何か間違ったことをしていますか?[managedObjectContext save:]を呼び出して、他のmanagedObjectContextに変更を通知する必要はありませんか?ドキュメントに一時的なpersistentStoreを作成させるにはどうすればよいですか?autosaveDocumentWithDelegate:...ドキュメントを実際に保存する(したがって、を作成するpersistentStore)ための呼び出しが行われないのはなぜですか?

関連している:

4

1 に答える 1

3

同様の問題を解決しました。永続的なオブジェクトIDを生成する必要があり、永続的なストアの存在が必要です。ご指摘のとおり、まだ自動保存されていない無題のドキュメントには、永続的なストアがありません。

この省略されたスニペットは、私のNSWindowControllerサブクラスからのものです。

- (void) awakeFromNib {
    //hacky way to get an autosave to generate an NSPersistentStore.
    GSNativeDocument *doc = self.document;
    [doc updateChangeCount:NSChangeDone];
    [doc autosaveDocumentWithDelegate:self didAutosaveSelector:@selector(document:didAutosave:contextInfo:) contextInfo:nil];
}

//called by the autosave operation started in awakeFromNib.
- (void)document:(NSDocument *)document didAutosave:(BOOL)didAutosaveSuccessfully contextInfo:(void *)contextInfo
{
    GSNativeDocument *doc = self.document;
    [doc updateChangeCount:NSChangeUndone];
}

自動保存を誘導する他のすべての方法では作成されないのに、変更カウントを更新すると「実際の」自動保存が作成されるのはなぜですか。私は見当もつかない。私はこのバグを1月上旬にAppleに提出し、開発フォーラムに投稿しましたが、彼らは答えていません。

于 2013-02-01T18:57:44.867 に答える