iOS GCD Sync with Async Block

后端 未结 2 1754
情深已故
情深已故 2021-01-06 14:35

I have an async function with a block :

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

I need to call this funct

2条回答
  •  傲寒
    傲寒 (楼主)
    2021-01-06 15:15

    You can use dispatch_async with semaphores:

    Example:

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

    Console output:

    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
    

提交回复
热议问题