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



>我尝试将 addObserver 方法替换为通知发布者 但是我不能让它工作,希望有人可以帮忙

我尝试在 viewDidLoad 下设置发布者并接收来自另一个 swiftui 的通知。由于我无法使其工作,所以我在viewWill下将其显示在同一个swift文件中进行调试。在下面的编码中,我只能从老派方法接收它,而来自 viewWillEmerge 的方法不是从 viewDidLoad 接收的。viewDidLoad 中的设置不起作用,如果我错过了让 temp2 = 在视图下将出现,它也不起作用。这是联合收割机的错误吗?

结果是 嘟�� 中交

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)
}

.sink运算符返回一个AnyCancellable。所以你的abc属性是一个AnyCancellable.

AnyCancellable文件说

AnyCancellable实例在取消初始化时自动调用cancel()

由于abc是本地属性,因此在返回viewDidLoad时将其取消初始化。因此,当viewDidLoad返回时,您的订阅将被取消。

您需要将AnyCancellable存储在实例属性中,以便它存活下来。Cancellable定义了有帮助的store方法。

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

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)
}

最新更新