等待 dispatch_semaphore 以等待许多异步任务完成的正确方法

Posted

技术标签:

【中文标题】等待 dispatch_semaphore 以等待许多异步任务完成的正确方法【英文标题】:correct way to wait for dispatch_semaphore in order to wait for many async tasks to complete 【发布时间】:2013-10-19 09:08:44 【问题描述】:

我有一个异步方法longRunningMethodOnObject:completion:

此方法接收“对象”类型的对象 - 使用其数据,然后调用完成处理程序。

我需要调用许多不同的“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
  );

【问题讨论】:

Opening Several UIDocuments in Succession and Waiting for Them to Finish 的可能重复项 "当你的应用程序不再需要信号量时,它应该调用 dispatch_release 来释放它对信号量对象的引用并最终释放它的内存。" - dispatch_semaphore_create 【参考方案1】:

我想你可以在这种情况下使用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()

Concurrency Programming Guide 有点像这个话题。向下滚动到“等待队列任务组”

要回答有关任务是否在队列中同时执行的问题,这取决于。在上面的示例中,_myQueue 是一个串行队列。全局命名队列是并发的。从 ios 5 开始,您还可以使用 DISPATCH_QUEUE_CONCURRENT 队列类型创建并发队列。

【讨论】:

dispatch_group_async 绝对是这个用例的更好方法。记得在完成后释放调度组。 dispatch_release(group);

以上是关于等待 dispatch_semaphore 以等待许多异步任务完成的正确方法的主要内容,如果未能解决你的问题,请参考以下文章

Javascript异步等待不等待猫鼬等待

学会等待作文

拆分进程以等待 NodeJS 上的事件

如何使脚本以简单的方式统一等待/休眠

重新启动集群时出错:重新启动 kube-proxy:等待 kube-proxy 启动以进行 configmap 更新:等待条件超时

iOS - 如何延迟显示消息“购买成功”以等待验证收据完成