以下方法将一些图像上载到远程服务器。我希望它们彼此独立上传(并行)。
- (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
成为并行队列?我希望添加到此队列的块不等待以前的操作完成。
非常感谢你的帮助!
答案 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]
创建的任何队列都将是并发的,这意味着传递给它的操作将并行运行。