1

MyOperationオブジェクト(NSOperationから継承)を作成し、NSOperationQueueに追加しています。次に、MyOperationでKVOを実行しています。私はこの方法を使用しています

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context;

終了した場合にMyOperationから値を取得します。このメソッドでは、他のクラスの便利なメソッドを使用して、他のデータを取得しています。

たぶんここでobserveValue...メソッドの同期の問題がありますか?

4

2 に答える 2

12

コメントしたり反対票を投じたりするのに十分な評判はありませんが、dannywartnabyの回答に反対票を投じます。NSOperationは、その操作で本質的にKVOを使用します。処理の一部としてisFinishedとisExecutedを実装する必要があります。たとえば、100%KVOであり、クライアント/キューとの操作に必要なコントラクトの一部です。したがって、これらを避けるべきであるとアドバイスすることは不正確です。NSOperationはKVO自体を使用するため、dannywartnabyの前提を採用すると、NSOperationの実装自体に欠陥があることが示されますが、これは間違いなく当てはまりません。

確かに、開発者はKVOを適切に使用するように注意する必要がありますが、NSOperationのサブクラス化は、おそらく経験豊富なObjective-Cプログラマーに残された重要なタスクであると私は主張します。通知は、操作によって行われる種類の作業には粗すぎると主張することができますが、常にではありませんが、ベストプラクティスとして間違ったメッセージが渡されないように、プラクティスについてアドバイスするときは注意が必要だと思います。ダニー、NSOperationまたはスレッドを使用するときにKVOの使用が推奨されない理由について詳しく説明していただけますか?NSOperation実装の多くの例はKVOを使用しています...

于 2011-03-24T14:43:15.140 に答える
-3

あなたのユースケースはわかりませんが、スレッド/操作にKVOを使用するのは賢明ではありません。

代わりに、操作オブジェクトが完了したら通知を送信することができます。または、デリゲートプロトコルを定義し、オペレーションにデリゲートを指定します...次に、performSelectorOnMainThreadを使用して、指定されたデリゲートに対してオペレーションによって呼び出されるある種の「myOperationComplete:」メソッドを定義できます。

于 2010-04-09T15:34:03.833 に答える