ObservedObject, EnvironmentObject, StateObject

ObservedObject, EnvironmentObject, StateObject

Mikhail Pushkarev

Привет друг 🙂 Рад тебя видеть на новой теме. Скажу так, это сложно понять в теории, но легче понять как это работает на практике.

От слову к делу..

о ObservedObject...

Чтобы понять как работает ObservedObject, рассмотрим пример со State:

На видео я показывал как работать с данными. Это тебе пригодится когда ты будешь изучать базу данных. А вот форма записи без использования структуры:


Что такое @StateObject?

Где-то между @State и @ObservedObject лежит @StateObject. Это специализированная версия @ObservedObject, и она работает почти так же: ты должен соответствовать протоколу ObservableObject и ты можешь использовать @Published, чтобы пометить свойства как вызывающие уведомления об изменениях, и любые представления, которые наблюдают за @StateObject, будут обновляться и их тело тоже.

Окей. Почти ничего не изменилось, ты спросишь, а в чем тогда различие между @StateObject и @ObservedObject ?

Есть одно важное различие между @StateObject и @ObservedObject, а именно право собственности - какое представление создало объект, а какое - просто наблюдает за ним.

Правило таково: какое бы представление ни создавало твой объект первым, оно должно использовать @StateObject, чтобы сообщить SwiftUI, что он является владельцем данных и отвечает за их сохранение. Все другие представления должны использовать @ObservedObject, чтобы сообщить SwiftUI, что они хотят отслеживать изменения объекта, но не владеют им напрямую.


Что такое @EnvironmentObject?

Более детально предлагаю тебе ознакомится с @EnvironmentObject на данном примере. Выпиши себе этот код ниже в тестовый проект и поиграйся с ним.

Что же такое @EnvironmentObject? Это значение, которое становится доступным для твоих представлений через само приложение - это общие данные, которые каждое представление может прочитать при желании. Итак, если в твоем приложении есть некоторые важные данные модели, которые необходимо прочитать всем представлениям, ты можешь либо передать их из представления в представление для просмотра, либо просто поместить в среду, где каждое представление имеет к нему мгновенный доступ.

Думай о @EnvironmentObject как о большом удобстве для тех случаев, когда тебе нужно передать много данных по твоему приложению. Поскольку все представления указывают на одну и ту же модель, если одно представление изменяет модель, все представления немедленно обновляются - нет риска рассинхронизации различных частей твоего приложения.

Проще говоря @EnvironmentObject тебе понадобится для обновления твоих данных с базы данных. Вот такая тавтология получается 🙂

Подведем итог:

  • @State - обеспечивает привязку к свойству, владеет состоянием, используется для типов значений
  • @Published - позволяющая нам создавать наблюдаемые объекты, которые автоматически сообщают, когда происходят изменения.
  • @Binding - обеспечивает привязку к свойству, не имеет собственного состояния, может использоваться для типов значений (и свойств ссылочных типов, которые являются типами значений!)
  • @ObservedObject - обеспечивает привязку к свойствам наблюдаемого объекта, не имеет собственного состояния, инициализирован где-то еще, используется для ссылочных типов
  • @EnvironmentObject - обеспечивает привязку к свойствам объекта среды, не имеет собственного состояния, инициализируется где-то еще, передается через environmentObject (_ :)
  • @StateObject - обеспечивает привязку к свойствам объекта состояния, владеет состоянием, инициализируется локально, используется для ссылочных типов

Обязательные ссылки для изучения:


Report Page