0

スレッド化されたNSOperationでいくつかのコアデータ操作を実行しようとすると、多くの問題が発生します。

現在、スレッド化されたNSOperationsで純粋に使用される管理対象オブジェクトコンテキストをアプリデリゲートに作成しました。最大同時実行数が1のNSOperationQueueをセットアップして、各アクションがシリアルに実行されるようにします。操作(インターネットからデータを取得して新しい管理対象オブジェクトを作成する)ごとに、使用するコンテキストを渡します。新しいオブジェクトが作成されたら、次に使用する操作のためにコンテキストを保存してリセットします。ただし、これを実行しているときに断続的にmallocエラーが発生し、それを理解するために何日も費やしました。これは、スレッド化の方法と関係があるように見えます。

私が得ているエラーは、この関連するスタックオーバーフローの質問で見ることができます。

管理対象オブジェクトのプロパティをオブジェクトに設定しているだけで、mallocエラーが発生していNSNumberます。また、そのプロパティを設定するのは初めてなので、自分自身を解放しすぎているわけではありません。私はそれをまったく理解できず、GuardMallocを使用してエラーを再現することはできません、それは発生しません!トリガーされている他の場所でエラーが発生しているようですが、どこで発生しているのかわかりません。

私が推測できるのは、エラーがどういうわけか私がすべてを設定した方法に関連しているということです。に操作を追加するのではなく、自分で操作を実行しようとしましたが、NSOperationQueue正常に動作しているように見えます(ただし、メインスレッドがハングします!)。

また、保存が行われたときにアプリ内の他のコンテキストに通知するためのコンテキストも必要なので、通知を確認しNSManagedObjectContextDidSaveNotificationます。ただし、保存はNSOperation(他のスレッド)で実行されているため、通知は実行中のスレッドでのみディスパッチされるため、これに問題がありますか?

4

3 に答える 3

2

CoreDataプログラミングガイドの「CoreDataを使用したマルチスレッド」セクションを読みましたか?

于 2009-11-22T18:21:21.800 に答える
2

古い質問を復活させるが、これは誰かを助けるかもしれない-私はここで説明されている同じセットアップ(各NSOperationの専用コンテキスト、1つの最大同時実行性)で同様の問題に遭遇しました、そしてそれは私が作成していたという事実によるものであることがわかりましたメインスレッドのNSOperation専用コンテキストで、NSOperationスレッドで使用しようとしました。コンテキスト作成をNSOperationのメイン関数に移動すると、問題はなくなりました。

于 2010-10-29T12:45:11.843 に答える
0

そうです、私はそれをすべて機能させることができました。何日もいじり回した後、スレッドとコアデータに関連するすべてのコードを書き直すことにしましたmalloc。エラーは発生しなくなりました。それはかなり複雑な設定なので、そこにはかなりあいまいなものがあったに違いありません!

于 2009-11-22T20:55:32.843 に答える