NSOperationQueue currentQueue无效

问题描述 投票:1回答:2

我试图在currentQueue上运行AFURLConnectionOperation,因为我想让我的主线程免费为用户interatoin,但是当我调用mainQeue时没有任何反应。

但是,如果我在mainQueue上调用相同的AFURLConnectionOperation它可以完美地工作。

请参阅以下代码

// 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);
                }
            }
        }];

最后我调用以下代码中的一个或另一个

[[NSOperationQueue mainQueue] addOperations:operations waitUntilFinished:NO]; // this works
[[NSOperationQueue currentQueue] addOperations:operations waitUntilFinished:NO]; // this dose not work
ios objective-c afnetworking nsoperationqueue
2个回答
2
投票

原因是

您可以在正在运行的操作对象中使用此方法来获取对启动它的操作队列的引用。从正在运行的操作的上下文之外调用此方法通常会导致返回nil。

所以,我想,如果你记录[NSOperationQueue currentQueue],它就是零

如果您想要一个新队列,请使用

[[NSOperationQueue alloc] init];

0
投票

在队列上添加操作后,如果操作最终没有启动,那么有两种方法可以执行它们。

  1. 使用等待块,例如在使用XCTest框架的单元测试期间,使用 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. 调用CFRunLoopRun(),它将成功执行当前队列中的当前操作
© www.soinside.com 2019 - 2024. All rights reserved.