SwiftUI ObservableObject используется как странное поведение EnvironmentObject
У меня такой ObservableObject
что я ввожу в иерархию представлений, используя environmentObject()
.
class MenuModel: ObservableObject {
@Published var selection: Int = 0
@Published var isMenuOpen: Bool = false
@Published var tabItems : [TabItem] = [TabItem]()
// {
// didSet {
// objectWillChange.send()
// }
// }
@Published var menuItems : [MenuItem] = [MenuItem]()
// {
// didSet {
// objectWillChange.send()
// }
// }
//var objectWillChange = PassthroughSubject<Void, Never>()
}
И вот проблемы, которые я не очень хорошо понимаю: 1. Вышеупомянутый код работает правильно, так как все свойства @Published. 2. Но если я изменю его на что-то вроде этого
class Click5MenuModel: ObservableObject {
@Published var selection: Int = 0
@Published var isMenuOpen: Bool = false
var tabItems : [TabItem] = [TabItem]()
{
didSet {
objectWillChange.send()
}
}
var menuItems : [MenuItem] = [MenuItem]()
{
didSet {
objectWillChange.send()
}
}
var objectWillChange = PassthroughSubject<Void, Never>()
}
Затем свойства @Published перестают обновлять представления, которые зависят от этого ObservableObject! Это почему. Я тоже пытался добавитьdidSet
с objectWillChange.send()
но это также вызывает странное поведение, и код выглядит немного неудобным.
Означает ли это, что я могу использовать ТОЛЬКО подход @Published или ТОЛЬКО objectWillChange?
1 ответ
Реализация по умолчанию просто работает (если у вас есть свойства @Published). Вот из объявления API:
/// By default an `ObservableObject` will synthesize an `objectWillChange` /// publisher that emits before any of its `@Published` properties changes: ... @available(iOS 13.0, OSX 10.15, tvOS 13.0, watchOS 6.0, *) extension ObservableObject where Self.ObjectWillChangePublisher == ObservableObjectPublisher { /// A publisher that emits before the object has changed. public var objectWillChange: ObservableObjectPublisher { get } }
поэтому удалите следующее:
var objectWillChange = PassthroughSubject<Void, Never>()
и использовать
didSet {
self.objectWillChange.send()
}