Итак, первый вопрос: как dispatch_async определяет, какой поток использовать?
Вы не должны думать о потоках при использовании GCD. Это все решается за кулисами для вас. Вы думаете о очередях , которые вы передаете dispatch_async
вместе с блоком для выполнения. Очередь GCD как бы отображается в потоке, но вам не нужно беспокоиться о том, что происходит за кулисами - GCD справится со всем этим для вас.
Что касается вашего кода, который, как я полагаю, выглядит примерно так:
dispatch_async(myQueue, ^{
// Do some stuff off the main queue
dispatch_async(dispatch_get_main_queue(), ^{
// Do something with the UI
});
});
В этом нет ничего . Вам не нужно беспокоиться о том, что поток, в котором работает блок, отправленный на myQueue
, может быть прерван. Очередь будет оставаться до тех пор, пока не закончится работа блока. Тот факт, что вы отправляете в основную очередь в исходной отправке, - это хорошо, работа в главной очереди будет успешно выполняться идеально.
Я думаю, вы также спрашиваете, почему при использовании NSURLRequest
в асинхронной диспетчеризации вы видите, что он никогда не вызывает обратный вызов. Это будет связано с тем, что он тесно связан с текущим циклом выполнения, и если вы в данный момент находитесь в фоновом потоке (на котором будет работать ваш myQueue
), то этот цикл выполнения больше не будет выполняться, пока другой блок не будет помещен в очередь. Таким образом, ваш обратный вызов никогда не запускается.
Я призываю вас пойти и прочитать больше о GCD и о том, что на самом деле означает асинхронность против синхронизации, поскольку я чувствую, что вы, возможно, еще не до конца понимаете это. Я ответил на аналогичный вопрос о том, что здесь .