私は問題を抱えており、それが何であるか、そしてそれを修正する方法を広い意味で知っていると確信していますが、解決策を実装するためのクリーンでベストプラクティスの方法が何であるかはわかりません. .
私の問題: バックグラウンド スレッドで 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 つのクラス メソッド) に渡すため、問題が発生します。
するべきか
- PersistentStoreCoordinator をビュー コントローラーに渡し、それをバックグラウンド タスクに渡すことができるようにして、バックグラウンド タスクが独自のローカル ManagedObjectContext を作成できるようにしますか?
- App Delegate で ManagedObjectContexts のプールを作成し、それらすべてを View Controller に渡すことで、それ自体を使用し、他のものをバックグラウンド タスクに渡すことができますか?
- まったく別の何か?