Source
Затишна Галера | iOSКомпас 🧭1️⃣5️⃣4️⃣ Завдання 154Чим взагалі відрізняється `@StateObje...
620 Views/Reach
2026-05-13 08:32
Message №2648
#iOSКомпас 🧭1️⃣5️⃣4️⃣ Завдання 154Чим взагалі відрізняється `@StateObject` від `@ObservedObject`?Доброго здровля мої любі друзі. З вами ваш незмінний ios розробник Сергій з @badlinkschannel.🔣 SwiftUI виглядає простим - поки не доходиш до state management. А потім раптово зʼявляється питання: чим взагалі відрізняється @StateObject від @ObservedObject?. І головне - коли який використовувати, щоб не зламати життєвий цикл.1️⃣ @ObservedObject - «я просто слухаю»@ObservedObject var viewModel: MyViewModel
Це найпростіший кейс: View не створює обʼєкт, вона лише підписується на нього. Тобто:➖ обʼєкт приходить ззовні➖ View не контролює його життєвий цикл➖ View просто реагує на зміни🤓 Типовий сценарій - dependency injection:ParentView { ChildView(viewModel: viewModel)}
`ChildView` нічого не знає про створення `viewModel`. І це нормально.2️⃣ Проблема: View перерисовується частіше, ніж здаєтьсяSwiftUI постійно пересоздає View. І якщо ти робиш так:@ObservedObject var viewModel = MyViewModel()
то:➖ View пересоздалась➖ `viewModel` створився заново➖ стан втраченоЦе одна з найпідліших пасток.3️⃣ @StateObject - «я володію цим обʼєктом»@StateObject var viewModel = MyViewModel()
Тут усе інакше:➖ обʼєкт створюється один раз➖ SwiftUI зберігає його між перерисовками➖ View контролює його життєвий циклЦе означає: навіть якщо View пересоздалась - viewModel залишиться той самий.4️⃣ Ключова різницяЯкщо спростити:➖ `@StateObject` - створює і володіє➖ `@ObservedObject` - отримує і спостерігаєІ все.Але саме це «і все» ламає половину SwiftUI-коду в продакшені.5️⃣ Як не помилитисяПросте правило:➖ Якщо створюєш обʼєкт у View -> `@StateObject`➖ Якщо передаєш ззовні -> `@ObservedObject`6️⃣ Антипатерн, який всі робилиstruct MyView: View { @ObservedObject var vm = MyViewModel()}
Виглядає нормально.Працює... поки View не почне оновлюватись.Потім:➖ скидається state➖ губляться дані➖ зʼявляються «фантомні» баги7️⃣ Чому це важливоЦе не про синтаксис. Це про життєвий цикл і ownership.SwiftUI - декларативний, але памʼять і стан ніхто не відміняв.І якщо неправильно обрати wrapper:➖ або витече логіка➖ або почне ресетитись state➖ або все разомSwiftUI виглядає магією тільки до першого бага зі state. Далі - чиста інженерія.@Zatishna_Galera