Search code examples
iosasynchronousafnetworkingkey-value-observingnsoperationqueue

Previously posted solution to getting Notification (on NSOperationQueue finishing all tasks) is not working for me


Get notification when NSOperationQueue finishes all tasks

I have the same issue as the one posted by @porneL in the post above. I tried the solution posted by @NickForge (one that received 57 votes), but I am obviously doing it wrong because it does not work for me. Here is the problem setup and my implementation:

I need to start a spinner before kicking off a set of web-service operations, and stop the spinner when they are complete. The webservices are invoked through a shared AFHTTPClient instance (part of the AFNetworking package) which adds them to its NSOperationQueue.

I set up an observer in the ViewController from which the data loads are kicked off. Did this using the answer from the above post. Implementation in my VC looks like:

In my ViewController's init method:

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

In my ViewController's observeValueForKeyPath method:

- (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!");
        }

    }
}

The ViewController's observeValueForKeyPath method however never gets called!

Any help to get this working would be most appreciated so I can then complete implementing the spinner.


Solution

  • Does operationQueue have a property called DataLoaderEvent? Normally one monitors the "operationCount" property of an NSOperationQueue.

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

    "The NSOperationQueue class is key-value coding (KVC) and key-value observing (KVO) compliant. You can observe these properties as desired to control other parts of your application. The properties you can observe include the following:

    operations - read-only property

    operationCount - read-only property"