I have an async function with a block :
[self performAsyncTaskCompletion:(void(^) () )
{
//Do Something
}
];
I need to call this funct
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