2

NSOperation が NSOperationQueue に追加または削除されたときに通知を受け取りたいです。「操作」プロパティ (現在キューにある NSOperations の配列) を監視するキー値を設定しようとしていますが、起動されていません。構文に何か問題がありますか?

@implementation myOperationQueueSubclass

-(id)init
{
    if (self = [super init])
    {
    // Initialization code here
    [self addObserver:self
                forKeyPath:@"operations"
                   options:0
                   context:nil];

    }
    return self;
}

- (void)observeValueForKeyPath:(NSString *)keyPath
                  ofObject:(id)object
                    change:(NSDictionary *)change
                   context:(void *)context {
    NSLog(@"queue changed...");
    if ([keyPath isEqualToString:@"operations"]) {

        if (self.operationCount == 0) {
            // No ops

        } else {
            // Has ops
        }
    }
}
4

2 に答える 2

2

構文に問題はありませんが、配列自体ではなく、配列のプロパティを監視しています (いずれにせよ、変更された場合に KVO 通知を発行しません)。

何らかの理由で再割り当てされた場合は通知されますがNSOperationQueue、通知を手動で行うか、KVC アクセサーを使用して、オブジェクトが に追加または削除されたときに他のユーザーが確認できるようにする必要がありoperationsます。

于 2012-08-14T00:33:32.663 に答える
1

私も同様のニーズがあり、このgithubプロジェクトで非常に薄いオペレーションマネージャーであるOperationsRunnerを作成しました。他のオブジェクトは、NSOperationsQueueの代わりにこのクラスと直接インターフェースします。ほんの一握りのメソッドしかありません-操作を実行する、キャンセルする、キュー内の操作の数を尋ねるなど。

私がしたことは、操作キューに追加された操作への参照を保持するために可変セットを使用し、操作が完了またはキャンセルされたときにそれを削除することでした-一種のシャドウコンテナ。

このクラスの優れた点は、他の種類のクラスに簡単に追加して操作を管理し、保留中のすべての操作をすばやくキャンセルできることです。

于 2012-08-14T13:33:56.603 に答える