7

削除されるストアに関連付けられた NSManagedObjectContext を他のスレッドが使用しているアプリケーションで、永続ストアを削除する (そして新しいストアを作成する) 安全な方法はありますか? NSPersistentStoreCoordinator をロックして、操作が終了した後にロックを解除しようとしましたが、役に立ちませんでした。すべての試行でデッドロックが発生しました。これは常に次の行で発生します (メイン スレッドで実行されます)。

[self.persistentStoreCoordinator removePersistentStore: store error: &error];
4

3 に答える 3

2

私はこれを試していませんが、mocのドキュメント setPersistentStoreCoordinator:から...

コーディネーターは管理対象オブジェクト モデルを提供し、永続性を処理します。複数のコンテキストがコーディネーターを共有できることに注意してください。

コーディネーターが nil の場合、このメソッドは例外を発生させます。永続ストア コーディネーターからコンテキストを「切断」したい場合は、コンテキストへのすべての強い参照を nil に設定し、通常どおり割り当てを解除できるようにする必要があります。

これは、psc を削除する安全な方法は、最初に moc を持つすべてのスレッドに psc を解放させ (ARC では nil-out 参照)、次に以下を実行することであることを示唆しています。removePersistentStore:

于 2014-05-05T17:22:59.670 に答える
1

削除されるストアに関連付けられた NSManagedObjectContext を他のスレッドが使用しているアプリケーションで、永続ストアを削除する (そして新しいストアを作成する) 安全な方法はありますか?

ライブの管理対象オブジェクトが永続ストアにアクセスしようとしないことを保証できれば安全です。この部分は重要です。古い永続ストアからロードされた、または関連付けられた、いかなる種類のライブ オブジェクトも存在しないことを確認する必要があります。

これは、各管理オブジェクト コンテキストをリセットすることで実行できます。

[managedObjectContext performBlockAndWait:^{
    [managedObjectContext reset];
}];

すべての管理対象オブジェクト コンテキストに対してこれを実行したら、永続ストアを削除できます。

これらのコンテキストからフェッチされた管理対象オブジェクトがある場合は、属性値の読み取りや書き込み、またはそれらの値の使用を一切行わずに、すぐにそれらを破棄する必要があることに注意してください。これらのオブジェクトはさまざまな理由でコンテキストを使用する必要があるかもしれませんが、コンテキストを呼び出した後resetはそれらについて何も知りません。それらは、触った瞬間にアプリを爆破するのを待っている時限爆弾であるため、すぐに(理想的にはリセットを呼び出す前でも)取り除きます。

于 2014-05-05T20:57:44.167 に答える
1

ここで説明されているアプローチを使用してみます (セクションParent/Child Contexts ): Multi-Context CoreData

基本的に、PSC に関連付けられている MOC は 1 つだけです (親 MOC)。他のスレッドには独自の MOC があり、それらのparentContextセットはメイン MOC (PSC に関連付けられているもの) に設定されています。

次に、次のようなことを試すことができます。

// Save each child MOC
for (NSManagedObjectContext *moc in self.someChildMOCs)
{
   [moc performBlockAndWait:^{

       // push to parent
       NSError *error;
       NSAssert([moc save:&error]);
       moc.parentContext = nil;
   }];
}

// Save parent MOC to disk
[self.mainMOC performBlockAndWait:^{
   NSError *error;
   NSAssert([mainMOC save:&error]);
}];

[self.persistentStoreCoordinator removePersistentStore:store error:&error];
mainMOC.persistentStoreCoordinator = nil;
于 2014-05-05T17:23:52.473 に答える