2010年10月20日水曜日

非同期処理と通知とスレッドセーフ

NSOperationQueue と KVO ( Key-Value Observing )を組み合わせればスレッドセーフかどうかを気にしなくていで実装できるのかも、と期待してみたが違うようだ。

監視と通知は、それぞれのオブジェクトのスレッドで行われるらしい。

NSOperationQueue と NSNotificationCenter と NSObjectの performSelectorOnMainThread:withObject:waitUntilDone: の組み合わせが良さそう。


KVO しているプロパティがバックグラウンドスレッドで変更されたら、オブザーバのメソッドも同じバックグラウンドスレッドで呼び出されます。
UIKit とスレッドのお約束 - Elegant Apps Developers




2010-10-26 追記:それと、KVO じゃなくて NSOperation の話になるけれども以下のことを付け足しておく。

メインスレッドから [queue cancelAllOperations] などとして、別スレッドでバックグラウンド実行中処理の [myOperation cancel] が発動されると、[myOperation cancel] はメインスレッドで実行される。そんでそのバックグラウンド実行中のものは別スレッドでそのまま動いているから、どっちがどっちって感じになってしまうと。

キャンセル>即処理終了、ってことではないから、isCancelled とか使ってキャンセルされるときのことも考えて書いていこうね。ってことで。

0 件のコメント:

コメントを投稿