withObservationTracking срабатывает ровно один раз ⚠️

🔍 withObservationTracking(_:onChange:) даёт реагировать на изменения @Observable-модели откуда угодно — из сервиса, менеджера, актора, а не только из SwiftUI-вьюхи. Одно чтение блока apply регистрирует все прочитанные свойства сразу. Дальше onChange срабатывает один раз и снимает регистрацию — в реализации там буквально onChange(); tracking.cancel(). Хотите наблюдать дальше — перерегистрируйтесь внутри onChange.

⚠️ Про тайминг: onChange — это willSet-обработчик. Он вызывается синхронно внутри сеттера до того, как новое значение записано. Читать актуальное значение прямо в onChange нельзя. А вот совет «отправьте в следующий runloop» — это фольклор. Требование ровно одно: прочитать после записи. Task { @MainActor in … } это обеспечивает, но никакого порядка относительно других мутаций не гарантирует.

💡 Что дальше: SE-0506 «Advanced Observation Tracking» уже принят (Swift 6.4) и наконец добавляет явные опции .willSet / .didSet / .deinit и withContinuousObservationTracking, чтобы не перерегистрироваться руками.

#Swift #ObservationFramework #SwiftUI #iOS #AdvancedSwift

withObservationTracking срабатывает ровно один раз ⚠️ | Сетка — социальная сеть от hh.ru