.send()和.sink()对于Xcode 11 Beta 5中的PassthroughSubject似乎不再起作用

索林的面孔

在下面的代码中,当按下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")  
    }  
}

PS我知道按下按钮时还有其他打印字符串的方法,我只想显示一个简单的发送-接收示例

康提基

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Xcode 11 beta 6背后的Xcode 11 beta 7下载链接?

Xcode 11 beta swift ui preview not showing

如何在Xcode 10中打开Xcode 11 Beta 4项目?

Swift 5(Xcode 11 Beta 5&6)-如何写入JSON文件?

iOS:如何在Xcode 11中自动升级CFBundleVersion和CFBundleShortVersionString?(我的旧脚本不再起作用)

我可以下载Xcode 11 beta 5的iOS 13 beta 6模拟器吗?

Xcode 11 Beta中的字体样式已更改

在Xcode 6 Beta 4中,用SKShapeNode进行笔触不再起作用

iOS 11 Beta 2 / Xcode Beta 3 AutoLayout问题

我们可以在新的macOS Catalina 10.15 Beta中使用Xcode 10.2.1和Xcode 11 Beta吗

合并中的延迟和去抖动调度程序应该是什么?(仅限Xcode 11 beta 1)

在Xcode 10和11 beta之间切换时,“安装其他必需组件”

INVoiceShortcutCenter.shared.setShortcutSuggestions(suggestions)在iOS 13 Beta中崩溃。Xcode 11 Beta

一起使用NavigationLink,@ EnvironmentObject和List时Xcode 11 beta 3崩溃

Xcode 11 beta 3上UIAction的语法

Xcode 11 Beta 4存档快速错误

Xcode 11 Beta 5-加载插件失败

在xcode 11 beta5和swiftui上进行深层链接

Xcode 11 Beta 5中的API更改后,如何在SwiftUI中为TextField使用RoundedBorderTextFieldStyle?

SwiftUI / CoreData /母版/明细(带有编辑)/ Xcode 11-Beta 5

在Xcode 11 Beta 5中使用ForEach时为什么会出错?

升级到iOS13 beta 6 / Xcode 11 beta 5后:发出“ dyld:未找到符号:_ $ s7SwiftUI7BindingVyxGAA0C11ConvertibleAAMc”

DefaultPickerStyle在Xcode 11 beta 6 swiftUI中不起作用

解决Xcode 11 beta 5中的SwiftUI Path崩溃

LineChart在Xcode 11.1和11.2 Beta中不起作用

ContextMenu中的NavigationLink在iOS14 xcode12 beta3中不再起作用?

用txt文件中的字符串填充数组[XCode6 Beta1的解决方案不再起作用]

Xcode 11 Beta 4 TabbedView 绑定问题

Xcode 11 Beta 5 - 模态仅触发一次