簡體   English   中英

iOS GCD與異步塊同步

[英]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的更激進的重構。 然后,您可以將這些添加到指定了NSOperationQueuemaxConcurrentOperationCount ,從而實現相同的並發性,同時還控制並發度。 但希望上面說明了這個想法:同時運行任務,但是在沒有阻塞主線程的情況下檢測這些任務的完成。

您可以將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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM