Вхід Реєстрація
Реклама
Ваше рекламне місце
Забронюйте цей слот без конкуренції на обраний період.
Купити рекламу →
Логотип телеграм спільноти - Затишна Галера
Додано 06 січ 2025 🌐 UK

Затишна Галера

@Zatishna_Galera
Кількість підписників: 2 690
Фото: 1,570
Відео: 475
Посилання: 2,090
Опис:
Голова Одеського центру розробки DataArt та Delivery Director, капітан Затишної Галери, ділитимуся: завданнями із співбесід (QA/Delivery/Management), статтями, вакансіями, новинами зі світу IT. Контакт: [email protected] ; Patreon: patreon.com/CozyGalley
Джерело

Затишна Галера | iOSКомпас 🧭1️⃣5️⃣4️⃣ Завдання 154Чим взагалі відрізняється `@StateObje...

Логотип телеграм спільноти - Затишна Галера Затишна Галера @Zatishna_Galera
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