1

私は GCD を使用して、NSManagedObjectContext ('MOC') を作成し、CoreData オブジェクトを監視し、時には (準備ができたら) それらのシリアル化を Web サーバーにアップロードしてから、長時間実行されるバックグラウンド プロセス ('run_loop') を開始しています。それらを削除します。

HTTP 呼び出しに AFNetworking を使用しています。ブロックは、CoreData でサポートされていない MOC の所有者とは別のスレッドで実行されるため、問題は要求完了ハンドラー ブロックにあります。

GCD run_loop ブロックの先頭から NSThread を保存し、 performSelector:onThread:run_thread を使用しようとしましたが、実際にはセレクターをまったく呼び出していないようです。

dispatch_sync(run_queue) を使用してみましたが、これはスレッドが同じであることを保証するものではなく、GCD キューのみです。メイン スレッドで別の MOC を保存すると、後でハングします。

最終的には、完了コールバック ハンドラにブール値を設定し、ブール値スイッチを検出してメインの run_loop から MOC 作業を実行する追加のロジックを導入することだけが機能しました。

誰かがよりエレガントな修正を提案できますか? それとも、CoreData は単に GCD キューから開始された AFNetworking 要求と互換性がないのでしょうか?最初から低レベルのスレッド コントロールを調べる必要がありますか?

4

1 に答える 1

0

うーん..MOCとスレッドを処理するための推奨される方法は、メインスレッドのMOCのサブモックである新しいMOCを常に作成することです。メインスレッドにすべての保存を任せますが、GCDスレッドは基本的に変更をメインMOCにマージできます。

これをより簡単な方法で促進するために、https://github.com/magicalpanda/MagicalRecord/を使用してかなりの成功を収めました。

于 2012-07-11T08:19:06.130 に答える