HurkNburkS
HurkNburkS

Reputation: 5510

NSOperationQueue currentQueue not working

I am trying to run AFURLConnectionOperation seen below on the currentQueue as I want to keep my main thread free for user interatoin, however nothing happens when I call mainQeue.

However if I call the same AFURLConnectionOperation on mainQueue it works perfectly.

Pleas see following code

// Send Batch
        NSArray *operations = [AFURLConnectionOperation batchOfRequestOperations:mutableOperations progressBlock:^(NSUInteger numberOfFinishedOperations, NSUInteger totalNumberOfOperations) {
            NSLog(@"%lu of %lu complete", (unsigned long)numberOfFinishedOperations, (unsigned long)totalNumberOfOperations);
        } completionBlock:^(NSArray *operations) {
            // check batch response
            NSError *error;
            for (AFHTTPRequestOperation *op in operations) {
                if (op.isCancelled){
                    return ;
                }
                if (op.responseObject){
                    // Current JSON Batch complete
                    NSMutableArray *jsonObject = [NSJSONSerialization JSONObjectWithData:op.request.HTTPBody options:kNilOptions error:&error];
                    // Update sent_flag using current chunk
                    [[SyncModel sharedInstance] updateSentFlag:jsonObject];
                }
                if (op.error){
                    error = op.error;
                    NSLog(@"Error == %@", error);
                }
            }
        }];

Then finally I call one or the other of the following code

[[NSOperationQueue mainQueue] addOperations:operations waitUntilFinished:NO]; // this works
[[NSOperationQueue currentQueue] addOperations:operations waitUntilFinished:NO]; // this dose not work

Upvotes: 1

Views: 1257

Answers (2)

Sumit Kumar Saha
Sumit Kumar Saha

Reputation: 799

After adding the operation on queue, if the operation doesn't start eventually then there are two ways to get them executed.

  1. Using wait block, for example during unit test using XCTest framework, use

    XCTestExpectation *expectation1 = [self    expectationWithDescription:@"ExtractColorsInternal function call on     NSOperationQueue"];
     dispatch_async(dispatch_get_main_queue(), ^{
    
    [expectation1 fulfill];
    });
    
    [self waitForExpectationsWithTimeout:1000 handler:^(NSError *error) {
    if (error != nil) {
        NSLog(@"Error: %@", error.localizedDescription);
    }
    }];
    
  2. call CFRunLoopRun(), which would execute the present operation in current queue succesfully

Upvotes: 0

Leo
Leo

Reputation: 24714

The reason is

You can use this method from within a running operation object to get a reference to the operation queue that started it. Calling this method from outside the context of a running operation typically results in nil being returned.

So,I guess,if you log [NSOperationQueue currentQueue],it is nil

If you want a new queue,use

[[NSOperationQueue alloc] init];

Upvotes: 2

Related Questions