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

2024-05-16

在下面的代码中,当按下按钮时,“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在视图中,我将发布一种方法。但是,在视图内,您可能应该使用.onReceive()反而。这要简单得多。

使用水槽:

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

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

Using .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)
        }
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐

  • SSAS MDX 计算运行总计但排除不太重要的行

    老 SQL 开发人员 MDX 新手 需要帮助来满足在运行总计中包含小总计但不显示这些小总计的贡献行的要求 考虑这个数据 Amount Running Total Denver 6 321 6 321 Portland 8 426 14 74
  • Numpy 相当于 MATLAB 的 hist [重复]

    这个问题在这里已经有答案了 由于某种原因 Numpy 的 hist 总是返回比 MATLAB 的 hist 少 1 个 bin 例如在 MATLAB 中 x 1 2 2 2 1 4 4 2 3 3 3 3 Rep Val hist x un
  • 在 mvc4 中创建通用 mvc 视图

    我以前也提过类似的问题 没有得到答案 如何创建一个通用的 mvc4 视图 该视图可以显示传递给它的模型列表或单个模型 模型可以是个人 组织或团体 无论传递给它的是什么 如果您正在寻找类似的东西 model MyViewModel
  • 在 MacOS 终端上运行 ffmpeg [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我对 MacOS 相当陌生 我发现使用终端来获取信息并不容易ffmpeg和我在 Window 上一样正常运行 我有 ffmpeg 二进制文件ffmpe
  • C++ 模板可以提供 N 个给定类的公共父类吗?

    我正在寻找一个 C 模板 它可以找到一组给定类的共同父级 例如 class Animal class Mammal public Animal class Fish public Animal class Cat public Mammal
  • Jenkins + Gradle + Artifactory:无法读取生成的构建信息

    我正在尝试使用 Jenkins Pipeline 调用 Gradle 工具 将我的工件推送到 Artifactory 我正在关注 GitHub 上发布的示例 Example1 https github com JFrogDev projec
  • 如何将会话管理添加到简单的 Perl CGI 网页?

    我有一个简单的网页 到目前为止不需要任何登录 它是用 Perl CGI 编程的 我想知道添加会话支持以便获得登录信息的步骤 我不需要非常复杂的方法 因为网页非常简单 另外 我想要一些关于支持 Perl 会话所需的技术 库的建议 我在很多很多
  • BadPaddingException:无效的密文

    我需要一些帮助 因为这是我第一次编写加密代码 加密代码似乎工作正常 但解密会引发错误 我得到的错误是 de flexiprovider api exceptions BadPaddingException 无效的密文 in the 解密函数
  • 跨应用程序使用 Django 模型?

    因此 在我的 Django 项目中 我有几个不同的应用程序 每个应用程序都有自己的模型 视图 模板等 让这些应用程序进行通信的好方法 Django 方式 是什么 一个具体的例子是一个会议应用程序 它有一个会议模型 我有一个家庭应用程序 我想
  • Angularjs : $locationProvider.hashPrefix("!") ;

    我想将网址显示为 www test com 因为我正在使用 locationProvider hashPrefix 但它显示网址为 www test com 我想 哈希之前而不是哈希之后 Thanks var app angular mod
  • 确定分割形状几何体的“左”侧和“右”侧

    我的问题是 我怎样才能确定哪一个Aside and Bside的侧面已经分割的旋转矩形几何体 http nbviewer jupyter org urls dl dropbox com s ll3mchnx0jwzjnf determine
  • PyInstaller“ValueError:源代码字符串不能包含空字节”

    我得到了一个ValueError source code string cannot contain null bytes执行命令时pyinstaller main py在具有和不具有管理员权限的cmd中 Traceback most re
  • WPF DataGrid - 在每行末尾添加按钮

    我想在数据网格的每一行的末尾添加一个按钮 我找到了以下 xaml 但它将按钮添加到开头 有人知道如何在所有数据绑定列之后添加它吗 这会将按钮添加到开头而不是末尾
  • 如何使用 jQuery 单击特定链接时打开引导导航选项卡的特定选项卡?

    我是 jquery 和 bootstrap 的新手 所以请考虑我的错误 我已经创建了一个用于登录和注册的 bootstrap 模式 它包含两个导航选项卡 称为登录和注册 我有两个按钮可以弹出相同的模态窗口 但在模态窗口内显示不同的选项卡 每
  • 获取当前图片在图库中显示的位置

    在我的应用程序中 我有一个图片库 但我想检测当前显示图像的位置 例如 当我启动我的活动时 位置是 0 但是当我在图库中滚动时 我想获取当前显示图像的位置 我尝试过 OnFocusChanged OnItemClicked 但只有当我单击图库
  • 自定义卡片形状 Flutter SDK

    我在 Flutter 上使用 GridView 开发了一个应用程序 GridView 项目是卡片 默认卡片形状是半径为 4 的矩形 我知道 Card Widget 有 shape 属性 并且它需要 ShapeBorder 类 但我无法找到如
  • 如何以编程方式创建 CardView

    我正在开发一个 Android 应用程序Java Android Studio 我想在活动中创建CardView以编程方式 我想将以下属性设置为CardView layout width wrap content layout row 0
  • rust-analyzer 未能发现 vscode 中的工作区

    我开始学习 Rust 语言 但有一个问题rust analyzervscode 扩展名 它不提供代码完成 如链接所示 https rust analyzer github io manual html magic completions h
  • 在 Android Chrome 中隐藏 HTML5 音频/视频通知

    我的网络应用程序上有一个 HTML5 音频元素 在某些时候 我使用以下代码以编程方式停止播放 audioElement pause audioElement currentTime 0 播放音频时 我的 Android 设备 使用 Goog
  • .send() 和 .sink() 似乎不再适用于 Xcode 11 Beta 5 中的 PassthroughSubject

    在下面的代码中 当按下按钮时 Test 应该打印在控制台中 但事实并非如此 该事件不是通过发布者发送的 知道 Xcode 11 Beta 5 中的 PassthroughSubject 发生了什么吗 在 Xcode 11 Beta 4 中效