Observation framework (появился в iOS 17) и более старый протокол ObservableObject оба позволяют реализовать реактивное обновление UI в SwiftUI, но они существенно отличаются уровнем детализации отслеживания изменений.
С ObservableObject, любое изменение свойства @Published вызывает повторный рендер всех представлений, подписанных на этот объект, даже если представление не использует изменённое свойство.
class MyModel: ObservableObject {
@Published var name: String = ""
@Published var count: Int = 0
}
MyModel, перерисовывается когда изменяется либо name, либо countМакрос @Observable использует отслеживание на уровне свойств, то есть SwiftUI автоматически определяет какие конкретно свойства читает представление во время выполнения.
@Observable
class MyModel {
var name: String = ""
var count: Int = 0
}
name, не будет перерисовано при изменении count@Published@Observable отслеживает на уровне свойств; ObservableObject отслеживает на уровне объекта@Observable сокращает лишние перерисовки, обновляя только представления, которые зависят от изменённых свойств@Observable требует меньше кода — не нужны аннотации @Published@Observable требует iOS 17+, тогда как ObservableObject поддерживает более ранние версииИспользуй @Observable для проектов iOS 17+, чтобы получить более точное отслеживание изменений и лучшую производительность рендеринга из коробки.
Макрос @Observable автоматически отслеживает, какие конкретные свойства представление читает во время выполнения, тогда как ObservableObject вызывает переиндексирование представления каждый раз, когда изменяется любое свойство @Published, независимо от того, использует ли его представление.
Новый — ещё не проверен сообществом
Вы