【发布时间】:2014-12-01 19:43:48
【问题描述】:
以下方法将一些图像上传到远程服务器。我希望它们彼此独立上传(并行)。
- (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 成为并行队列?我希望添加到此队列的块不等待先前的操作完成。
非常感谢您的帮助!
【问题讨论】:
-
为什么不直接打印它在调试器中支持的并发操作数。输入这个问题可以节省 10 分钟的时间。此外,还有一个方便的在线文档。
标签: objective-c multithreading macos nsoperation nsoperationqueue