Таймер раз в секунду перерисовывает весь экран заказа вместе с картой
Экран доставки в SwiftUI использует одну ViewModel — ObservableObject с двенадцатью @Published-свойствами. Одно из них, оставшееся время до курьера, обновляется каждую секунду. На экране также лежит тяжёлая карта с маршрутом. Профилирование показывает, что раз в секунду пересчитывается всё тело экрана, включая карту, и скролл подтормаживает.
Какой подход решает проблему по сути?
- Обернуть карту в AnyView — это отключает её участие в пересчёте тела
- Перенести обновление таймера на фоновую очередь, чтобы главный поток не тратил время на пересчёт тела
- Заменить @StateObject на @ObservedObject — тогда обновления перестанут доходить до всего экрана
- Разделить состояние: часто меняющееся значение вынести в отдельный объект и подвью
