Мне нужно запустить method
с block
, несколько раз внутри for loop
. Я также должен дождаться завершения всего выполнения blocks
.ObjectiveC ожидание для блоков цикла с семафором
Моя проблема заключается в том, что я не могу понять, что я делаю неправильно, что заставляет мое приложение замораживаться. Вот код:
dispatch_semaphore_t semaphore = dispatch_semaphore_create(0);//1 - creating semaphore
for(int i = 0; i< myObj.count; i++){
[[DataManager shared] verifyObjectId:myObj[i].id
completionBlock:^(BOOL found) {
if(found){
//code here
dispatch_semaphore_signal(semaphore);//3 - signaling semaphore to continue
}
}];
dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);//2 - getting semaphore to wait
}
//I want to continue once all DB checks complete
Теперь, я не понимаю, почему semaphore
не отпустит, а for loop
не будет продолжаться.
Что мне действительно нужно, это для semaphore
для освобождения после завершения всех проверок БД. В идеале я бы хотел, чтобы semaphore
ждал за пределами for loop
. Любые предложения о том, как это сделать?
EDIT: Решение: (на основе принятого ответа)
// create a group
dispatch_group_t group = dispatch_group_create();
for(int i = 0; i< myObj.count; i++){
// pair a dispatch_group_enter for each dispatch_group_leave
dispatch_group_enter(group);
[[DataManager shared] verifyObjectId:myObj[i].id
completionBlock:^(BOOL found) {
if(found){
//code here
}
dispatch_group_leave(group); //1 leave
}];
//Get a notification on a block that will be scheduled on the specified queue
dispatch_group_notify(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{
NSLog(@"-all done!-");
//code here
});
}
Я понимаю, что вы говорите. Я собираюсь экспериментировать с тем, что вы предлагаете. – nightfixed