>我尝试将 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)
}