【问题标题】:How do I observe the "operations" property of NSOperationQueue?如何观察 NSOperationQueue 的“操作”属性?
【发布时间】:2012-08-13 23:54:49
【问题描述】:

我希望在我的 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
        }
    }
}

【问题讨论】:

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


    【解决方案1】:

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

    如果由于某种原因被重新分配,您会收到通知,但NSOperationQueue 将不得不费心手动发出通知,或使用KVC accessors 允许其他人查看何时添加或删除对象来自其operations

    【讨论】:

    • 如何让 NSOperationQueue 手动发出通知?应该重写哪些方法?您能否举例说明在这种情况下如何使用 KVC 访问器?
    • 我在发布此内容时试图想出一个解决方案。您必须做一些严肃的子类化工作,因为对数组的每一个更改都必须包含在willChangeValueForKey:didChangeValueForKey: 中。我最好的(最简单的)想法是覆盖addOperation:——你可以在那里发布通知,然后传递给[super addOperation:op]。问题是在删除操作时收到通知。您可以添加一个完成块,它会在操作结束时通知您,这将接近从队列中删除的时间。
    • 另一种可能是骇客(这让我想尝试一下)是从超类中以某种方式获取operationsmutable KVC proxy。让我想想那个……
    • "当队列数为0时"...你的意思是你想知道最后一个操作什么时候完成?
    • 更好的解决方案是观察operationCount 属性。每当添加/完成操作时,它将增加/减少。
    【解决方案2】:

    我也有类似的需求,并创建了一个非常精简的运营经理,OperationsRunner in this github project。其他对象与此类而不是直接与 NSOperationsQueue 交互。它只有少数几种方法 - 运行操作、取消操作、询问队列中的操作数量等。

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

    这个类的好处是你可以很容易地将它添加到任何其他类来管理操作,并快速取消所有挂起的操作。

    【讨论】:

    • 它是 NSOperationsQueue 的子类吗?
    • 不,它没有任何子类。它大约有 100 行代码(减去 cmets)。 .h 文件中也有类似 6 个操作的“如何采用”列表。事实上,除非你使用它,否则它甚至不会被实例化。即使您不想使用该类,您也可以了解如何维护第二个操作集合。
    猜你喜欢
    • 2020-01-19
    • 1970-01-01
    • 1970-01-01
    • 2013-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多