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