以前发布的获取通知的解决方案(在NSOperationQueue完成所有任务)对我不起作用

时间:2013-01-22 23:39:23

标签: ios asynchronous afnetworking key-value-observing nsoperationqueue

Get notification when NSOperationQueue finishes all tasks

我和@porneL在上面的帖子中发布的问题相同。我尝试了@NickForge发布的解决方案(获得57票的一个),但我显然做错了,因为它对我不起作用。这是问题设置和我的实现:

我需要在开始一组Web服务操作之前启动一个微调器,并在它们完成时停止微调器。 Web服务通过共享的AFHTTPClient实例(AFNetworking包的一部分)调用,该实例将它们添加到NSOperationQueue

我在ViewController中设置了一个观察者,从中启动了数据加载。这是否使用了上述帖子的答案。在我的VC中实现如下:

在我的ViewController的init方法中:

//add WelcomeVC as an observer for AFHTTPClient dataloadOps notifications
[[[MyCustomAFHTTPClient sharedClient] operationQueue] addObserver:self forKeyPath:@"DataLoaderEvent" options:0 context:NULL];

在我的ViewController的observeValueForKeyPath方法中:

- (void) observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {
    if( (object == [[MyCustomAFHTTPClient sharedClient] operationQueue])
       && [keyPath isEqualToString:@"DataLoaderEvent"]) {

        if ( [[[MyCustomAFHTTPClient sharedClient] operationQueue] operationCount] == 0) {

            NSLog(@"EUREKA!!! QUEUE IS EMPTY! DATALOAD HAS COMPLETED!");
        }

    }
}

然而,ViewController的observeValueForKeyPath方法永远不会被调用!

任何帮助实现这项工作都将非常受欢迎,因此我可以完成实现微调器。

2 个答案:

答案 0 :(得分:4)

operationQueue是否有一个名为DataLoaderEvent的属性?通常,一个人监视NSOperationQueue的“operationCount”属性。

请参阅http://developer.apple.com/library/ios/#documentation/Cocoa/Reference/NSOperationQueue_class/Reference/Reference.html#//apple_ref/doc/uid/TP40004592

“NSOperationQueue类是键值编码(KVC)和键值观察(KVO)兼容。您可以根据需要观察这些属性以控制应用程序的其他部分。您可以观察到的属性包括:< / p>

操作 - 只读属性

operationCount - 只读属性“

答案 1 :(得分:-1)

试试这个:

[operation setCompletionBlock: ^{
    NSLog(@"Finished an image.");
}];