0

Core Dataプログラミングガイドスレッド制限パターンに関するトピックがあり、それは次のように述べています。

が使用されるスレッドで管理コンテキストを作成する必要があります。NSOperationを使用する場合、そのinitメソッドは呼び出し元と同じスレッドで呼び出されることに注意してください。したがって、キューのinitメソッドでキューの管理対象オブジェクトコンテキストを作成しないでください。作成しないと、呼び出し元のスレッドに関連付けられます。代わりに、main(シリアルキューの場合)またはstart(並行キューの場合)でコンテキストを作成する必要があります

どうしてなのかわからないの?違いはどこですか?

4

2 に答える 2

2

あなたが引用したドキュメントでなぜかなり明確なのかを述べています。操作initメソッドは呼び出し元のスレッドで実行されますが、mainメソッドで発生する作業は別のスレッドで実行される場合があります。

スレッド間で管理オブジェクト コンテキストを共有することはできないため、使用するスレッドと同じスレッドで作成する必要があります。したがって、操作で使用する場合は、操作が実行されているのと同じスレッドでコンテキストが作成されていることを確認する必要があります。

シリアル操作がメインでコンテキストを作成する理由は、並行操作を実装するときにstartオーバーライドしながらデフォルトの実装を実行するためです。start

並行操作の仕組みについては、同時実行プログラミング ガイドを参照してください(ヒント: 「開始」を検索してください)。

于 2012-06-27T11:11:40.000 に答える
0

デビッドは正しいです。

ドキュメントには、たとえば、NSOperationサブクラスが呼び出され、次のようにメソッドMyOperationをオーバーライドした場合、init

- (id)init
{
   if(self = [super init]) {

        // your context here       
   }

   return self;
}

次に、その操作をメインスレッドでインスタンス化すると

MyOperation* op = // alloc-init

作成したコンテキストは、操作が実行されるスレッドではなく、メイン スレッドにリンクされます。

バックグラウンドで管理オブジェクトを変更しているが、メインスレッドにあるコンテキストにアクセスしているため、管理オブジェクトで変更 (削除、更新など) を実行すると、奇妙なことが起こる可能性があります。

main代わりにオーバーライドして、そこでコンテキストを作成します。

- (void)main
{
    // your context here
}
于 2012-06-27T11:23:29.213 に答える