> Как вызвать синхронную задачу на главном потоке, чтобы избежать дедлока (iOS, Swift)
Уровень: senior · Роль: mobile · Категория: Технические вопросы
Компании: Битрикс24
Стек: iOS, Swift
> Пример ответа
В iOS синхронный вызов на главном потоке (DispatchQueue.main.sync) приводит к дедлоку, если сам код уже выполняется на главном потоке. Чтобы избежать этого, используйте проверку текущего потока:
SWIFTfunc performOnMainThreadSync(_ block: () -> Void) {if Thread.isMainThread {block()} else {DispatchQueue.main.sync(execute: block)}}
Или с помощью OperationQueue.main:
SWIFTif OperationQueue.current == OperationQueue.main {block()} else {OperationQueue.main.addOperations([BlockOperation(block: block)], waitUntilFinished: true)}
Более современный подход - использовать MainActor в Swift concurrency (iOS 13+):
SWIFTfunc performOnMainActorSync<T>(_ block: @MainActor () throws -> T) rethrows -> T {if Thread.isMainThread {return try block()} else {return try DispatchQueue.main.sync {try block()}}}
Ключевое правило: никогда не вызывайте sync на главной очереди, если не уверены, что вы не на главном потоке. Всегда проверяйте Thread.isMainThread перед синхронным вызовом.
> Похожие задачи по mobile
В чем плюсы и минусы Kotlin Multiplatform по сравнению с Flutter?
Что такое Storyboards и XIB
Как работает механизм управления памятью ARC в Swift
Когда вызывается метод viewDidAppear
> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?
Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью