iOS GCD Sync with Async Block



>我有一个带有块的异步函数:

[self performAsyncTaskCompletion:(void(^) () )
 {
   //Do Something
 }
];

我需要多次调用此函数,但以同步方式。我尝试使用 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
      }
      ];
   });
}

但它不起作用,因为dispatch_sync只是在等待块的结束。我怎么能要求它等待其块中的异步函数结束?

如果要在

完成一系列异步任务后启动某个进程,但希望允许这些任务彼此并发运行(尤其是对于网络请求,可以提供比按顺序运行它们更好的性能),则可以使用 dispatch group):

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
});

就我个人而言,我甚至可能倾向于对performAsyncTaskCompletion进行更彻底的重构,而是使用异步NSOperation子类模式。然后,您可以将这些添加到指定maxConcurrentOperationCountNSOperationQueue中,从而实现相同的并发性,同时控制并发程度。但希望上面能说明这个想法:并发运行任务,但检测这些任务的完成情况,而不会阻塞主线程。

您可以将

dispatch_async与信号量一起使用:

例:

- (void)performAsyncTaskCompletion:(void (^)())block {
    if (block) {
        block();
    }
}
- (void)runChainOfOperations {
    static dispatch_once_t onceToken;
    static dispatch_semaphore_t semaphore;
    static dispatch_queue_t queue;
    dispatch_once(&onceToken, ^{
        semaphore = dispatch_semaphore_create(1);
        queue = dispatch_queue_create("com.example.MyApp", NULL);
    });
    NSArray *array = @[@1, @2, @3, @4, @5];
    static long counter = 0;
    for (int i = 0; i < array.count; i++) {
        dispatch_async(queue, ^{
            dispatch_semaphore_wait(semaphore,  DISPATCH_TIME_FOREVER);
            [self performAsyncTaskCompletion:^{
                sleep(10);
                dispatch_async(dispatch_get_main_queue(), ^{
                     NSLog(@"%ld", counter++);
                });
                dispatch_semaphore_signal(semaphore);
             }];  
        });
    }
}

控制台输出:

2015-04-12 21:28:06.047 HKTest[9497:1136830] 0
2015-04-12 21:28:16.023 HKTest[9497:1136830] 1
2015-04-12 21:28:26.025 HKTest[9497:1136830] 2
2015-04-12 21:28:36.029 HKTest[9497:1136830] 3
2015-04-12 21:28:46.031 HKTest[9497:1136830] 4

最新更新