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()
}
Другие вопросы по тегам