.sink()
返回一个AnyCancellable
对象。你永远不应该忽视它。永远不要这样做:
// never do this!
publisher.sink { ... }
// never do this!
let _ = publisher.sink { ... }
如果将其分配给变量,请确保它不是短暂的。一旦可取消对象被释放,订阅也将被取消。
// if cancellable is deallocated, the subscription will get cancelled
let cancellable = publisher.sink { ... }
既然您要求sink
在视图中使用,我将发布一种方法。但是,在视图中,您可能应该.onReceive()
改用。它更简单。
使用水槽:
在视图中使用它时,您需要使用一个@State
变量,以确保它在生成视图主体后仍然存在。
这DispatchQueue.main.async
是必需的,以避免在视图更新时修改状态。如果你不这样做,你会得到一个运行时错误。
struct ContentView: View {
@State var cancellable: AnyCancellable? = nil
var body: some View {
let publisher = PassthroughSubject<String, Never>()
DispatchQueue.main.async {
self.cancellable = publisher.sink { (str) in
print(str)
}
}
return Button("OK") {
publisher.send("Test")
}
}
}
使用.onReceive()
struct ContentView: View {
var body: some View {
let publisher = PassthroughSubject<String, Never>()
return Button("OK") {
publisher.send("Test")
}
.onReceive(publisher) { str in
print(str)
}
}
}