Например, у меня есть метод с тремя асинхронными блоками. Каждый результат блока необходим для выполнения следующего блока для достижения результата конечных методов. Итак, что я ищу хорошую стратегия НОДА для make'em выполнять в строгом порядке и без врезных замковДождитесь завершения блоков асинхронных блоков
__block id task1Result;
__block id task2Result;
__block id finalResult;
[self startTask1:^(id result) { task1Result = result }]
[self startTask2:task1Result block:^(id result) { task2Result = result }]
[self startTask3:task2Result block:^(id result) { finalResult = result }]
UPD. Я нашел решение:
dispatch_semaphore_t sem = dispatch_semaphore_create(0);
__block id task1Result;
__block id task2Result;
__block id finalResult;
[self startTask1:^(id result) {
task1Result = result;
dispatch_semaphore_signal(sem);
}];
dispatch_semaphore_wait(sem, DISPATCH_TIME_FOREVER);
[self startTask2:task1Result block:^(id result) {
task2Result = result;
dispatch_semaphore_signal(sem);
}];
dispatch_semaphore_wait(sem, DISPATCH_TIME_FOREVER);
[self startTask3:task2Result block:^(id result) { finalResult = result }];
Но в моем случае, я столкнулся с проблемой, с каким-то методом библиотеки, который приносит приложение к тупиковой ситуации. > <
Не используйте семафоры. Это худшее возможное решение, так как оно может легко привести к инверсии приоритетов. Пожалуйста, используйте последовательную очередь для сериализации ваших операций. –
Можете ли вы привести пример кода, как я должен использовать их в моем случае? –
Создайте очередную очередь и отправьте свои блоки. Они будут исполняться по порядку. doggod дал вам пример ниже. –