1

私は問題を抱えており、それが何であるか、そしてそれを修正する方法を広い意味で知っていると確信していますが、解決策を実装するためのクリーンでベストプラクティスの方法が何であるかはわかりません. .

私の問題: バックグラウンド スレッドで dispatch_async を使用して、ファイルから一部のデータを Core Data Model にロードしています。これは、GUI でモデルにも影響を与えてから強打する場合を除いて、正常に機能します。たとえば、次のようになります。

'NSGenericException', reason: '*** Collection ... was mutated while being enumerated.'

...これは、2 つのスレッドが同じ ManagedObjectContext 内のデータをいじっているためだと思います。現時点では 1 つしか使用していないためです。

私が読んだすべての記事と回答は、バックグラウンド スレッドに別の ManagedObjectContext を使用する必要があることを教えてくれますが、どのように/どこで設定するのですか?

現在、PersistentStoreCoordinator と (1 つの) ManagedObjectContext を App Delegate に作成し、ManagedObjectContext を (唯一の) View Coordinator に渡しています。次に、それをバックグラウンド データ ロード タスク (モデル クラスの 1 つのクラス メソッド) に渡すため、問題が発生します。

するべきか

  1. PersistentStoreCoordinator をビュー コントローラーに渡し、それをバックグラウンド タスクに渡すことができるようにして、バックグラウンド タスクが独自のローカル ManagedObjectContext を作成できるようにしますか?
  2. App Delegate で ManagedObjectContexts のプールを作成し、それらすべてを View Controller に渡すことで、それ自体を使用し、他のものをバックグラウンド タスクに渡すことができますか?
  3. まったく別の何か?
4

1 に答える 1

0

私はまだ問題を一貫して再現できていません。タイミングに大きく依存しているようです。しかし、これを防ぐために私が行ったことは次のとおりです。

ビュー コントローラで:

- (void) loadNewStuff: (NSString *)stuffID
{
     dispatch_async(taskQueue, 
       ^(void){[MyModelClass loadNewStuff: stuffID withContext: myContext];}
     );
}

モデルクラスで:

+ (void) loadNewStuff: (NSString *)stuffID withContext: (NSManagedObjectContext *)passedContext
{
  NSManagedObjectContext *localContext = [[NSManagedObjectContext alloc] init];
  [localContext setPersistentStoreCoordinator: passedContext.persistentStoreCoordinator];

  // load new stuff, save local context, finished

}

...これで大丈夫ですか、それとも私をひどく噛む何かを見落としていますか?

(私は ARC を使用しているので、ローカルで作成されたコンテキストを明示的に解放しなくても問題ないと思いますか?)

于 2012-10-18T09:33:41.947 に答える