Привет, друзья! Сегодня разберем как правильно организовать задержку выполнения кода в 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 секунды. Пользователь не сможет прокручивать скролл, нажимать кнопки, приложение будет непригодным для использования в течении этого времени.
💡 Вывод:
Используйте асинхронные подходы вместо блокирующих. Ваше приложение должно оставаться отзывчивым в любой момент времени.
➡️ Подписаться на канал
Мобильный трудоголик