Вступить в клуб →
сложнаявопросUIKit и SwiftUI: экраны и состояние

Таймер раз в секунду перерисовывает весь экран заказа вместе с картой

Экран доставки в SwiftUI использует одну ViewModel — ObservableObject с двенадцатью @Published-свойствами. Одно из них, оставшееся время до курьера, обновляется каждую секунду. На экране также лежит тяжёлая карта с маршрутом. Профилирование показывает, что раз в секунду пересчитывается всё тело экрана, включая карту, и скролл подтормаживает.

Какой подход решает проблему по сути?

  • Обернуть карту в AnyView — это отключает её участие в пересчёте тела
  • Перенести обновление таймера на фоновую очередь, чтобы главный поток не тратил время на пересчёт тела
  • Заменить @StateObject на @ObservedObject — тогда обновления перестанут доходить до всего экрана
  • Разделить состояние: часто меняющееся значение вынести в отдельный объект и подвью

🔒 Проверка ответа — для участников клуба

  • Проверка ответа
  • Подсказка, если застряли
  • Разбор с объяснением, почему так
  • Прогресс по всем задачам и виртуальные собеседования
Зарегистрироваться →

Регистрация занимает минуту

Другие задачи раздела