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

Swiftui .send()和.sink()似乎不再适用于Xcode 11 Beta 5中的PassthroughSubject,swiftui,combine,Swiftui,Combine,在以下代码中,当按下按钮时,控制台中应打印“Test”,但未打印。事件未通过发布服务器发送。 知道Xcode 11 Beta 5中的PassthroughSubject发生了什么吗? (在Xcode 11 Beta 4中工作良好) var主体:一些视图{ 让publisher=PassthroughSubject() publisher.sink{(str)位于 打印(str) } 返回按钮(“确定”){ publisher.send(“测试”) } } 另外,我知道当按下按钮时还有其

在以下代码中,当按下按钮时,控制台中应打印“Test”,但未打印。事件未通过发布服务器发送。 知道Xcode 11 Beta 5中的PassthroughSubject发生了什么吗? (在Xcode 11 Beta 4中工作良好)

var主体:一些视图{
让publisher=PassthroughSubject()
publisher.sink{(str)位于
打印(str)
}  
返回按钮(“确定”){
publisher.send(“测试”)
}  
}
另外,我知道当按下按钮时还有其他打印字符串的方法,我只想展示一个简单的发送-接收示例。sink()返回一个
anycancelable
对象。你永远不应该忽视它永远不要这样做

//永远不要这样做!
publisher.sink{…}
//永远不要这样做!
让{=publisher.sink{…}
如果您将其分配给一个变量,请确保它不是短期的。一旦取消分配可取消对象,订阅也将被取消

//如果取消分配Cancelable,则订阅将被取消
让Cancelable=publisher.sink{…}
既然您要求在视图中使用
sink
,我将发布一种方法。但是,在视图中,您可能应该使用
.onReceive()
。这要简单得多

使用接收器:

在视图中使用它时,需要使用
@State
变量,以确保它在生成视图主体后仍然存在

DispatchQueue.main.async
是必需的,以避免在视图更新时修改状态。如果不这样做,则会出现运行时错误

struct ContentView:View{
@状态变量可取消:anycancelable?=nil
var body:一些观点{
让publisher=PassthroughSubject()
DispatchQueue.main.async{
self.cancelable=publisher.sink{(str)in
打印(str)
}
}
返回按钮(“确定”){
publisher.send(“测试”)
}
}
}
使用
.onReceive()

struct ContentView:View{
var body:一些观点{
让publisher=PassthroughSubject()
返回按钮(“确定”){
publisher.send(“测试”)
}
.onReceive(publisher){str in
打印(str)
}
}
}

您丢失了。请在订阅接收器时进行存储。 您可以使用.onReceive,但您的代码没有收到值,因为您需要添加.store(在:&订阅中)

var主体:一些视图{
var subscription=Set()
让publisher=PassthroughSubject()
publisher.sink{(str)位于
打印(str)
}.store(位于:&订阅中)
返回按钮(“确定”){
publisher.send(“测试”)
}  
}

为了解除订阅,我使用了如下内容:
self.cancelable=publisher.sink(receiveCompletion:{(completion)In self.cancelable=nil},receiveValue:{(str)In print(str)})
。这是正确的解决方案还是有更好的解决方案?我不是联合收割机方面的专家,但它似乎是正确的;-)作为一个组合式和反应式的初学者,周围的许多示例对于非常简单的任务来说似乎过于复杂:
struct ContentView:View{@State var string:string=”“{didSet{print(string)}}var body:some View{return Button(“OK”){self.string=“Test”}}
对于内联代码感到抱歉。我们为什么要使用主题?我猜是因为它为使用操作符等打开了机会?祝福你@kontiki
var body: some View {  

    let publisher = PassthroughSubject<String, Never>()

    publisher.sink { (str) in  
        print(str)  
    }  
    return Button("OK") {  
        publisher.send("Test")  
    }  
}
var body: some View {  
    var subscription = Set<AnyCancellable>()
    let publisher = PassthroughSubject<String, Never>()

    publisher.sink { (str) in  
        print(str)  
    }.store(in: &subscription)

    return Button("OK") {  
        publisher.send("Test")  
    }  
}