Джерело
Затишна Галера | iOSКомпас 🧭1️⃣5️⃣4️⃣ Завдання 154Чим взагалі відрізняється `@StateObje...
620 Охват/переглядів
2026-05-13 08:32
Повідомлення №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
Доброго здровля мої любі друзі. З вами ваш незмінний 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