2016-04-29 11 views
5

NSPrivateQueueConcurrencyTypeを持つスクラッチパッドとして子コンテキストを使用する際に問題があります。NSPrivateQueueConcurrencyTypeを使用する子コンテキストNSPrivateQueueConcurrencyType親コンテキストを使用する

私のコア・データ・スタックは、次のようになります。 core data stack

ビューコントローラは、メインコンテキストを使用しています。 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をフリーズするために、このスタックにリファクタリングしようとしています。

+0

マルチスレッドアサーションを引き起こしているperformBlockの中で何をしていますか?これは、何がうまくいかないかの手がかりを提供します。 – Tim

答えて

0

フェッチとその述語を表示することで、何が起こっているのかを判断するのに役立ちます。スレッド境界を越えてNSManagedObjectにアクセスしているようですが、おそらく述語に1つを使用していますか?

ところで、あなたのメインキューの下で作業者を移動させると、消費する通知に対処する必要はありません。他のすべてはまったく同じですが、処理するコードが少なくなり、スレッドの問題のリスクが少なくなります。

私は当初私のメインキューの下に働いていました。 PSC - >プライベートキュー - >メインキュー - >プライベートワーカー。私は、作業者のコンテキストがフェッチ/保存してインポートを見つけたり作成したりしている間、UIがブロックされていることを経験しているので、私が求めている設定にリファクタリングしています。コアデータスタックをリファクタリングする以外に、パフォーマンスを最適化する別の方法がありますか?

ブロックを子供のMOCから確認するために計測器を使用しましたか?どのような場合でも、問題の実際の原因である何か他のもの(通常はUI関連)であることがわかったという問題について聞いたことがあります。 THOUSANDSを不正な述語に対してフェッチしない限り、フェッチにヒットしてはいけません。それでも述語は問題を解決するために最適化されます。

保存に関しては、A)保存頻度を増やすか、B)プライベートMOCをライターとしてディスクに設定することができます。私はすべてのセーブが非同期であることが保証されるようにBを好む。

+0

私は当初、私のメインキューの下に働いていました。 PSC - >プライベートキュー - >メインキュー - >プライベートワーカー。 私は、作業者コンテキストがフェッチ/保存してインポートを見つけたり作成したりしている間、UIがブロックされていることを経験しているので、私が求めている設定にリファクタリングしています。コアデータスタックをリファクタリングする以外に、パフォーマンスを最適化する別の方法がありますか? – alivingston

関連する問題