Самый яркий пример дедлока в iOS происходит при попытке обновить UI из фонового потока без использования специальных механизмов.
swift
Объяснение:
UIKit (фреймворк для построения пользовательского интерфейса в iOS) не является потокобезопасным. Все операции с UI должны выполняться строго на главном потоке (main thread).
В приведенном выше примере, если вызвать блок DispatchQueue.main.sync { ... } из фонового потока, то:
sync, фоновый поток не может завершить свою работу, пока главный поток не выполнит переданный ему блок. Если главный поток уже заблокирован (например, ожидает завершения операции в фоновом потоке, которая в свою очередь ждет главного потока, или просто занят), возникает циклическое ожидание, то есть дедлок.Правильное решение:
Использовать асинхронную отправку на главный поток для обновления UI.
swift
Здесь фоновый поток не блокируется при отправке блока на главный поток, позволяя как фоновой задаче, так и главному потоку работать независимо, избегая дедлока.