Avn*_*arr 2 asynchronous semaphore objective-c grand-central-dispatch
我有一个异步方法 longRunningMethodOnObject:completion: 
此方法接收"Object"类型的对象 - 确实使用其数据,然后调用完成处理程序.
我需要调用许多不同的"longRunningMethods"并等待所有人完成.
我希望所有"longRunningMethodOnObject"在"for"循环中彼此异步(并行)运行.(我不确定"longRunningMethodOnObject"是否相互串行运行,但这更像是一个普遍的问题)
我不确定我是否已经创建了一个合适的信号量,并希望能够解释它们之间正确的同步方式.
包装函数的代码如下:
-(void)applyLongRunningOperationOnObjectInArray:(NSArray *)theObjects completion:(completion)block
{
// offsetting to worker thread in my object
  dispatch_async(self.myQueue,^{
    dispatch_semaphore_t semaphore = dispatch_semaphore_create(0); //Not sure if this should be here or in the for loop
    for(Object *ob in theObjects)
    {
    dispatch_semaphore_t semaphore = dispatch_semaphore_create(0); // the semaphore for the "for" loop - should this be here? or above the for loop
      [GlobalObject longRunningMethodOnObject:ob completion:^{ // would like each call to be independant of previous call in for loop
        dispatch_semaphore_signal(semaphore); // signaling that it completed
      }];
    }
    dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER); // would like to wait here for each semaphore 
    block(); // invoke the completion handler
  });
}
我想你可以dispatch_semaphore在这种情况下使用,但调度组可以使应用程序逻辑更简单:
NSArray *theObjects = @[@"Apple",@"Orange",@"Peach"];
dispatch_group_t group = dispatch_group_create();
dispatch_queue_t _myQueue = dispatch_queue_create("com.cocoafactory.DispatchGroupExample",
                                                      0);
for( id ob in theObjects ) {
    dispatch_group_async(group, _myQueue, ^{
        //  do some long running task.
    });
}
dispatch_group_wait(group, DISPATCH_TIME_FOREVER);
//  now do whatever should be done after
//  all of your objects are processed
//  in your case block()
在并发编程指南作为这个话题有点.向下滚动到'等待排队任务组'
要回答关于任务是否在队列中同时执行的问题,这取决于.在上面的示例中,_myQueue是一个串行队列.全局命名队列是并发的.您还可以使用DISPATCH_QUEUE_CONCURRENTiOS 5中的队列类型创建并发队列.
| 归档时间: | 
 | 
| 查看次数: | 9173 次 | 
| 最近记录: |