[英]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_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
});
就個人而言,我甚至可能傾向於使用異步NSOperation
子類模式執行performAsyncTaskCompletion
的更激進的重構。 然后,您可以將這些添加到指定了NSOperationQueue
的maxConcurrentOperationCount
,從而實現相同的並發性,同時還控制並發度。 但希望上面說明了這個想法:同時運行任務,但是在沒有阻塞主線程的情況下檢測這些任務的完成。
您可以將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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.