Objective c 等待dispatch_信号量以等待许多异步任务完成的正确方法

Objective c 等待dispatch_信号量以等待许多异步任务完成的正确方法,objective-c,asynchronous,grand-central-dispatch,semaphore,Objective C,Asynchronous,Grand Central Dispatch,Semaphore,我有一个异步方法longRunningMethodOnObject:completion: 此方法接收类型为“object”的对象,并处理其数据,然后调用完成处理程序 我需要调用许多不同的“longRunningMethods”,并等待所有操作完成 我希望所有的“longRunningMethodOnObject”在“for”循环中异步(并行)运行。(我不确定“longRunningMethodOnObject”是否彼此串行运行,但这更像是一个一般性问题) 我不确定我是否已经创建了一个合适的信号

我有一个异步方法
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\u信号量
,但是dispatch group可能会使应用程序逻辑更简单:

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()
在这个话题上,我的观点有点偏激。向下滚动至“等待队列任务组”


要回答关于任务是否在队列中并发执行的问题,这取决于。在上面的示例中,
\u myQueue
是一个串行队列。全局命名队列是并发的。从iOS 5开始,您还可以使用
调度队列\u concurrent
队列类型创建并发队列。

可能重复的“当您的应用程序不再需要信号量时,它应该调用dispatch\u release来释放对信号量对象的引用,并最终释放其内存。“-dispatch\u group\u async无疑是处理此用例的更好方法。记住在完成后释放dispatch组。dispatch\u release(group);