У меня есть два API вызовов следующим образом:dispatch_async понимания порядка выполнение
-(void) doTask1{
dispatch_async(queueSerial, ^{ //B1
[fileObj setFileInfo:file];
});
}
-(void) doTask2{
dispatch_async(queueSerial, ^{ //B2
[fileObj getFileInfo:fileName completion:^(NSError *error) {
dispatch_async(queueSerial2, ^{
//completion work C1
});
}]
});
}
Теперь мой вопрос, от того, что я уже понимаю, читая о НОДЕ, если процесс вызывает doTask1
и сразу после звонков doTask2
, это приведет к тому, что обе они будут поставлены в очередь и B1
впереди B2
.
Однако, действительно ли это, что B1
полностью выполнен до того, как B2
начинает выполнение? Поскольку файл, обновленный на B1
, используется B2
.
Если B2
начинает выполнять до того, как B1
полностью завершен, это может привести к некоторым проблемам.
Или лучше сделать
-(void) doTask1{
dispatch_sync(queueSerial, ^{B1});
}
-(void) doTask2{
dispatch_sync(queueSerial, ^{B2});
}
Спасибо за ваш комментарий. Я изменил свой вопрос, чтобы добавить более подробную информацию о коде. То, что я не понимаю, это ваш комментарий о том, что «нет никаких гарантий относительно отношений между ними» Что это значит? – ExceptionHandler
Я имею в виду, что в асинхронном случае любые вызовы кода doTask1(), doTask2(), возможно, продолжали выполнять различные другие операции до завершения отправляемой работы. В случае синхронизации вызывающий абонент также останавливается, пока не завершится операция последовательной очереди. –
Я вижу. Я понимаю эту часть. Если B2 отправляет обработчик завершения в другую очередь, возможно ли, чтобы этот блок завершения был выполнен до завершения B1? Есть ли способ убедиться, что этого не произойдет и что блок завершения в B2 ждет завершения B1? – ExceptionHandler