组合:将 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
是局部的属性,所以在viewDidLoad
returns时被去初始化。因此,当 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)
}
我尝试用 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 callscancel()
when deinitialized.
由于abc
是局部的属性,所以在viewDidLoad
returns时被去初始化。因此,当 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)
}