Добавить объявление

Как правильно делать задержку в iOS приложении и не блокировать интерфейс

Привет, друзья! Сегодня разберем как правильно организовать задержку выполнения кода в iOS-приложении.

DispatchQueue.main.asyncAfter:


Решение для задержки 2 секунды на главном потоке:

func showHelloMessage() {
DispatchQueue.main.asyncAfter(deadline: .now() + 2.0) {
print("Привет!")
}
// Код продолжает выполняться здесь без задержек
}

Task + await:


Для асинхронного контекста:

func showHelloMessage() async {
try? await Task.sleep(for: .seconds(2))
print("Привет!")
}

Timer:


Если нужно повторять действие с интервалом:

func showHelloMessage() {
Timer.scheduledTimer(withTimeInterval: 2.0, repeats: true) { _ in
print("Привет!")
}
}

Как делать не нужно:


Выполняем действие через 2 секунды:

func showHelloMessage() {
Thread.sleep(forTimeInterval: 2.0)
print("Привет!")
}

Кажется, что все работает, но за этой простотой скрывается серьезные проблемы:

  • Полностью блокирует поток. Пока поток «спит», он не может выполнять другие задачи, которые вы можете ожидать.

  • Особенно опасен на главном потоке. Если вызвать Thread.sleep() на главном потоке, ваш интерфейс зависнет на эти 2 секунды. Пользователь не сможет прокручивать скролл, нажимать кнопки, приложение будет непригодным для использования в течении этого времени.

Вывод:


Используйте асинхронные подходы вместо блокирующих. Ваше приложение должно оставаться отзывчивым в любой момент времени.
19.10.2025 74 477