是[NSOperationQueue mainQueue]是一个串行队列吗?
以下方法将一些图像上传到远程服务器。我希望它们彼此独立上传(并行)。是[NSOperationQueue mainQueue]是一个串行队列吗?
- (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
并行队列?我想要添加到此队列的块不等待以前的操作完成。
非常感谢您的帮助!
按照串行方式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.
谢谢,但是如果我想用[[NSOperationQueue alloc] init]创建的队列也是串行的呢?将它的'maxConcurrentOperationCount'设置为1是一个很好的方法吗? – AyushISM 2014-12-01 20:21:27
根据David的博客,您可以使用队列来限制使用setMaxConcurrentOperationCount的并行下载数量。 – 2014-12-01 20:28:26
是的,主队列始终是串行的。任何使用[[NSOperationQueue alloc] init]
创建的队列都将是并发的,这意味着传递给它的操作将并行运行。
谢谢,但是如果我想用[[NSOperationQueue alloc] init]创建的队列也是串行的呢?将它的'maxConcurrentOperationCount'设置为1是一个很好的方法吗? – AyushISM 2014-12-01 20:11:15
是的。请记住,您应该在所有操作中使用相同的优先级,以防止并发队列之间的优先级倒置。 – 2014-12-01 21:33:10
为什么不你刚刚打印,它在调试程序支持并发的OP数目。这个问题可以节省10分钟的时间。除此之外,还有一个方便的在线文档。 – Andy 2014-12-01 22:24:43