如何观察NSOperationQueue的“操作”属性?

时间:2012-08-13 23:54:50

标签: objective-c ios key-value-observing nsoperation nsoperationqueue

我想在NSOperationQueue中添加或删除NSOperation时收到通知。我正在尝试为“operations”属性(当前在Queue中的一组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
        }
    }
}

2 个答案:

答案 0 :(得分:2)

您的语法没有任何问题,但是您正在观察数组属性,而不是数组本身(当它发生变异时不会发出KVO通知)。

如果由于某种原因重新分配,您会收到通知,但是NSOperationQueue必须手动制作通知,或者使用KVC accessors,让其他人看到对象的时间已加入或移除operations

答案 1 :(得分:1)

我有类似的需求,并创建了一个非常瘦的操作管理器OperationsRunner in this github project。其他对象直接与此类接口而不是NSOperationsQueue。它只有少数方法 - 运行一个操作,取消它,询问队列中的操作数等等。

我所做的是使用一个可变集来保存对添加到操作队列的操作的引用,并在操作完成或取消时将其删除 - 这是一个阴影容器。

关于这个课程的好处是你可以轻松地将它添加到任何其他类来管理操作,并快速取消所有待处理的操作。