0

Насколько я понял, операции GCD UI всегда должны выполняться асинхронно по основному потоку/основной очереди. Но следующий код, похоже, также работает без каких-либо проблем. Может кто-нибудь объяснить, почему? Я пропускаю 2 блока синхронно с dispatch_async. Один блок загружает изображение, а другой отображает его на экране.Выполнение обновлений пользовательского интерфейса на основном потоке синхронно из параллельной очереди

dispatch_queue_t concurrentQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); 

    dispatch_async(concurrentQueue, ^{ 
    __block UIImage *image = nil; 

    dispatch_sync(concurrentQueue, ^{ 
    /* Download the image here */ 
    }); 

    dispatch_sync(dispatch_get_main_queue(), ^{ 
    /* Show the image to the user here on the main queue */ 
    }); 
}); 

ответ

0

Очередь важна (она должна быть основной очереди), но ли НОД вызовы являются синхронными или асинхронными не имеет никакого отношения - это только влияет, как остальная часть вашего кода вокруг НОД вызовов является временным. Как только блок запущен в очереди, не имеет значения, как это было запланировано.

Синхронная отправка может упростить ваш код (поскольку он не будет возвращен до тех пор, пока блок не будет выполнен), но при этом возникает риск блокировки, если вы в конечном итоге ожидаете завершения действий.

Смежные вопросы

 Смежные вопросы