组合:将 addObserver 替换为通知发布者时出现问题

Combine: Problem when replace addObserver with Notification publisher

我尝试用 Notification publisher 替换 addObserver 方法 但是我做不到,希望有人能帮忙

我尝试在 viewDidLoad 下设置发布者并接收来自另一个 swiftui 的通知。因为我不能让它工作,所以我让它在同一个 swift 文件中的 viewWillAppear 下进行调试。在下面的编码中,我只能从旧学校方法和 viewWillAppear 方法中接收它,而不是从 viewDidLoad 中接收它。 viewDidLoad 中的设置不起作用,如果我错过了 let temp2 = under viewWillAppear,它也不起作用。这是联合收割机的错误吗?

结果是 BBBB 中国交建

    override func viewDidLoad() {
    super.viewDidLoad()

    NotificationCenter.default.addObserver(forName: .dismissSwiftUI, object: nil, queue: .main) { (_) in
        print("BBBB")
    }
    let abc = NotificationCenter.default.publisher(for: .dismissSwiftUI).sink { (_) in
        print("AAAA")
    }
}


override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    //        self.checkIfProfitSetup()
    let temp2 = NotificationCenter.default.addObserver(forName: .dismissSwiftUI, object: nil, queue: .main) { (_) in
        print("CCCC")
    }

    NotificationCenter.default.post(name: .dismissSwiftUI ,object: nil)
}

The .sink operator returns 一个 AnyCancellable。所以你的 abc 属性 是 AnyCancellable.

The AnyCancellable documentation

An AnyCancellable instance automatically calls cancel() when deinitialized.

由于abc是局部的属性,所以在viewDidLoadreturns时被去初始化。因此,当 viewDidLoad returns.

时,您的订阅将被取消

您需要将 AnyCancellable 存储在实例 属性 中,这样它才能存活。 Cancellable 定义 a store method 有帮助。

我通常在我的代码中称它们为“票”,因为“可取消”太冗长了。因此:

private var tickets: [AnyCancellable] = []

override func viewDidLoad() {
    super.viewDidLoad()

    NotificationCenter.default.addObserver(forName: .dismissSwiftUI, object: nil, queue: .main) { (_) in
        print("BBBB")
    }

    NotificationCenter.default.publisher(for: .dismissSwiftUI)
        .sink { _ in print("AAAA") }
        .store(in: &tickets)
}