0

以下方法将一些图像上传到远程服务器。我希望它们彼此独立上传(并行)。是[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并行队列?我想要添加到此队列的块不等待以前的操作完成。

非常感谢您的帮助!

+0

为什么不你刚刚打印,它在调试程序支持并发的OP数目。这个问题可以节省10分钟的时间。除此之外,还有一个方便的在线文档。 – Andy 2014-12-01 22:24:43

回答

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.

+0

谢谢,但是如果我想用[[NSOperationQueue alloc] init]创建的队列也是串行的呢?将它的'maxConcurrentOperationCount'设置为1是一个很好的方法吗? – AyushISM 2014-12-01 20:21:27

+0

根据David的博客,您可以使用队列来限制使用setMaxConcurrentOperationCount的并行下载数量。 – 2014-12-01 20:28:26

0

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

+0

谢谢,但是如果我想用[[NSOperationQueue alloc] init]创建的队列也是串行的呢?将它的'maxConcurrentOperationCount'设置为1是一个很好的方法吗? – AyushISM 2014-12-01 20:11:15

+0

是的。请记住,您应该在所有操作中使用相同的优先级,以防止并发队列之间的优先级倒置。 – 2014-12-01 21:33:10

相关问题