iOS GCD与异步块同步

Ala*_*din 3 asynchronous block objective-c grand-central-dispatch ios

我有一个块的异步功能:

[self performAsyncTaskCompletion:(void(^) () )
 {
   //Do Something
 }
];
Run Code Online (Sandbox Code Playgroud)

我需要多次调用此函数,但需要以同步方式调用.我试图使用GCD队列:

dispatch_queue_t queue = dispatch_queue_create("com.MyApp.task", NULL);
for (int i = 0; i < array.count; i++)
{
   dispatch_sync(queue, ^{
     [self performAsyncTaskCompletion:(void(^) () )
      {
        //Do Something
      }
      ];
   });
}
Run Code Online (Sandbox Code Playgroud)

但它不起作用,因为dispatch_sync只等待块的结束.如何让它等待其块中的异步函数结束?

Rob*_*Rob 7

如果要在完成一系列异步任务后启动某个进程,可以使用调度组,但是希望允许这些任务相互之间并发运行(特别是对于网络请求,可以提供更好的性能)而不是顺序运行它们:

dispatch_group_t group = dispatch_group_create();

for (int i = 0; i < array.count; i++) {
    dispatch_group_enter(group);
    [self performAsyncTaskCompletion: ^{
        //Do Something
        dispatch_group_leave(group);
    }];
}

dispatch_group_notify(group, dispatch_get_main_queue(), ^{
    // do this when its all done
});
Run Code Online (Sandbox Code Playgroud)

就个人而言,我甚至可能倾向于performAsyncTaskCompletion使用异步NSOperation子类模式执行更激进的重构.然后,你可以添加这些到NSOperationQueuemaxConcurrentOperationCount指定的,能够得到相同的并发性,同时控制并发度.但希望上面说明了这个想法:同时运行任务,但是在没有阻塞主线程的情况下检测这些任务的完成.