2

每当从我的 NSOperationQueue 中添加或删除 NSOperation 时,我都希望收到通知。我正在尝试为“操作”属性(当前在队列中的 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 回答