gpt4 book ai didi

swiftui - .send() 和 .sink() 似乎不再适用于 Xcode 11 Beta 5 中的 PassthroughSubject

转载 作者:行者123 更新时间:2023-12-04 11:17:13 25 4
gpt4 key购买 nike

在下面的代码中,当按下 Button 时,“Test”应该打印在控制台中,但事实并非如此。事件不是通过发布者发送的。
知道 Xcode 11 Beta 5 中的 PassthroughSubject 发生了什么吗?
(在 Xcode 11 Beta 4 中它运行良好)

var body: some View {  

let publisher = PassthroughSubject<String, Never>()

publisher.sink { (str) in
print(str)
}
return Button("OK") {
publisher.send("Test")
}
}

附言我知道还有其他方法可以在按下按钮时打印字符串,我只想展示一个简单的发送接收示例

最佳答案

.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在 View 中,我将发布一种方法。但是,在 View 中,您可能应该使用 .onReceive()反而。它更简单。

使用接收器:

在 View 中使用时,需要使用 @State变量,以确保它在生成 View 主体后仍然存在。
DispatchQueue.main.async是必需的,以避免在 View 更新时修改状态。如果你不这样做,你会得到一个运行时错误。

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

关于swiftui - .send() 和 .sink() 似乎不再适用于 Xcode 11 Beta 5 中的 PassthroughSubject,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57270850/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com