Deadlock возникает, когда два или более потока постоянно ждут друг друга, чтобы завершить свою работу — это означает, что ни один поток так и не закончит выполнение.
sync на текущей serial queue, что заставляет её ждать саму себяКлассический пример самой частой причины:
let queue = DispatchQueue(label: "com.example.myQueue")
queue.sync {
queue.sync { // Deadlock — очередь ждёт саму себя
print("This will never execute")
}
}
sync на текущей очереди — используй async когда возможноDispatchQueue.main.async вместо DispatchQueue.main.sync при обновлении UI из фонового потокаСамое важное правило — избегать синхронной отправки задач в очередь, которая уже выполняется. Грамотное проектирование очередей и предпочтение асинхронной отправки исключат большую часть рисков deadlock в коде на основе GCD.
Deadlock в GCD возникает, когда задача вызывает sync на том же serial queue'е, на котором она выполняется в данный момент, заставляя очередь бесконечно ждать собственного завершения.
Новый — ещё не проверен сообществом
Вы