[NSOperationQueue mainQueue]是一个串行队列吗?

时间:2014-12-01 19:43:48

标签: objective-c multithreading macos nsoperation nsoperationqueue

以下方法将一些图像上载到远程服务器。我希望它们彼此独立上传(并行)。

- (void)startUploadProcess {
    for (int i = 0; i < [imageNames count]; i++) {
        NSBlockOperation *blockOp = [NSBlockOperation blockOperationWithBlock:^{
            [GlobalsFuncs uploadImageToServer:[[NSImage alloc] initWithContentsOfURL:[imagePaths objectAtIndex:i]]  forSessionID:[[family SessionID] stringValue]  withFilename:[imageNames objectAtIndex:i]];
        }];

        blockOp.completionBlock = ^{
            [[NSOperationQueue mainQueue] addOperationWithBlock:^{
                [self afterUploadCompletion:i];
            }];
        };
        [bgQueue addOperation:blockOp];
    }
}

- (void)afterUploadCompletion:(NSInteger)pageNumber {
    NSLog(@"%ld for sessionID : %@", (long)pageNumber, family.SessionID);
    imagesUploaded++;
    [progressIndicator incrementBy:progressDelta];
}

从上面的代码中可以看出,我为每个图片添加了对afterUploadCompletion方法的调用。在该方法中,我递增一个作为类实例变量的整数。我的问题是,如果我的代码会导致竞争条件?基本上,我要问的是mainQueue中的所有内容是否都是连续执行的? 另外,如何使NSOperationQueue *bgQueue成为并行队列?我希望添加到此队列的块不等待以前的操作完成。

非常感谢你的帮助!

2 个答案:

答案 0 :(得分:2)

根据Apple Documentation [NSOperationQueue mainQueue]按顺序执行操作: -

[NSOperationQueue mainQueue]返回的队列在应用程序主线程上一次执行一个操作。主线程上的操作的执行与必须在主线程上执行的其他任务交错,例如事件的服务和应用程序的用户界面的更新。队列在运行循环通用模式下执行这些操作,如NSRunLoopCommonModes常量所示。

现在,如果要以并发或并行方式执行操作。请参考以下示例: -

NSOperationQueue * queue = [[NSOperationQueue alloc] init];
NSOperation * nwOperation = [[yourOper alloc] init];
[queue addOperation:nwOperation];

因此,如果向队列添加多个操作,它们都会在后台线程上并行执行,从而允许主线程处理用户界面。该队列将根据用户拥有的CPU核心数量智能地调度并行操作的数量,从而有效地利用用户的硬件。

修改的: -

有关并发操作的更多信息,请参阅此Dave Dribin's blog.

答案 1 :(得分:0)

是的,主队列始终是串行的。使用[[NSOperationQueue alloc] init]创建的任何队列都将是并发的,这意味着传递给它的操作将并行运行。