NSPrivateQueueConcurrencyTypeを持つスクラッチパッドとして子コンテキストを使用する際に問題があります。NSPrivateQueueConcurrencyTypeを使用する子コンテキストNSPrivateQueueConcurrencyType親コンテキストを使用する
ビューコントローラは、メインコンテキストを使用しています。 Worker Contextは、APIからデータをインポートするために使用されます。 MergeChangesFromContextDidSaveNotificationを使用して、メインとワーカーのコンテキスト間で変更をマージしています。私がWorker Childコンテキストを式から離れると、正しく動作しているように見えます。
ただし、オブジェクトをインポートするときに、worker子コンテキストをスクラッチパッドとして使用したいと思います。データの中には、ネストされたオブジェクトを構築する必要があるものがあります。構築プロセスのどこかにエラーがある場合は、そのコンテキストを取り除くだけです。ビルドが成功すれば、ワーカーの子コンテキストを保存して、その変更をワーカーコンテキストにプッシュして、変更をメインコンテキストに保存してマージできるようにすることが期待されます。
しかし、Worker Child Contextでフェッチ要求を実行しようとすると、Worker Child ContextのperformBlock
の内部で行われても、検索または作成を実行すると、マルチスレッドアサーションが発生します。
この質問に答えるのに役立つコードスニペットはわかりませんが、私の主な懸念は、私の全体的なアプローチがうまくいかないことです。別のコンテキストの子としてのプライベートキューコンテキストが悪い考えですか?
EDIT:
ワーカー子コンテキストは、検索を行うか、操作を作成するためのフェッチ要求を実行しようとしたとき、私が経験してるクラッシュがあります。これは、述語内の管理対象オブジェクトを使用せず、performBlockAndWait
にラップされています。私が得ている説明は'NSInternalInconsistencyException'です。理由: '文はまだ有効です'クラッシュは断続的ですが、これまでのところ、ネストされた作業者の子コンテキストがある場合にのみ発生します。
クラッシュを引き起こすフェッチ要求は、常にfindまたはcreate操作のため、一意の識別子を持つオブジェクトをフェッチしようとしています(つまり、私のダイアグラムの作業者の子コンテキストは、独自のオブジェクトの子コンテキストを持ちます)インポートされるオブジェクトの識別子に一致するプロパティ。したがって、述語は常に何かのようなものです"identifier in ["1234", "abc", "etc" ]
私がコメントで述べたように、私はもともとPSC - >プライベートコンテキスト - >メインコンテキスト - >プライベートワーカーコンテキストセットアップを使用していました。 UIをフリーズするために、このスタックにリファクタリングしようとしています。
マルチスレッドアサーションを引き起こしているperformBlockの中で何をしていますか?これは、何がうまくいかないかの手がかりを提供します。 – Tim