> Как вызвать синхронную задачу на главном потоке, чтобы избежать дедлока (iOS, Swift)

Уровень: senior · Роль: mobile · Категория: Технические вопросы

Компании: Битрикс24

Стек: iOS, Swift

> Пример ответа

В iOS синхронный вызов на главном потоке (DispatchQueue.main.sync) приводит к дедлоку, если сам код уже выполняется на главном потоке. Чтобы избежать этого, используйте проверку текущего потока:

SWIFT
func performOnMainThreadSync(_ block: () -> Void) {
if Thread.isMainThread {
block()
} else {
DispatchQueue.main.sync(execute: block)
}
}

Или с помощью OperationQueue.main:

SWIFT
if OperationQueue.current == OperationQueue.main {
block()
} else {
OperationQueue.main.addOperations([BlockOperation(block: block)], waitUntilFinished: true)
}

Более современный подход - использовать MainActor в Swift concurrency (iOS 13+):

SWIFT
func 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 перед синхронным вызовом.

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью