Swift Combine — JUST Publisher

之前文章介绍的Publisher都是可以连续发送数据的,Subscriber也可以一直接收数据,除非收到了finished或者error而结束。而JUST Publisher则不同,它只向每个订阅者发送一次输出,然后结束。

一起来看一下下面的代码。

swift 复制代码
class JustViewModel: ObservableObject {

  func sendMessage() {
    let justPublisher = Just("This is a Just publisher")
    let cancellable = justPublisher
      .sink { completion in
        print("---> Received completion: \(completion)")
      } receiveValue: { value in
        print("---> Received value: \(value)")
      }
  }
}

struct JustDemo: View {

  @StateObject private var viewModel = JustViewModel()

  var body: some View {
    VStack {
      Button("Send Message") {
        viewModel.sendMessage()
      }
      .buttonStyle(BorderedProminentButtonStyle())
    }
  }
}

上面的代码中在JustViewModel中添加了一个方法sendMessage,在该方法里面创建了一个Just Publisher,创建的时候直接传入要发送的值,然后通过sink方法添加Subscriber

当在UI上点击按钮调用这个方法的时候,看一下输出:

很明显,点击后,初始化Just发送了初始化时的值,sink方法的receiveValue闭包调用了,随后也调用了Completion闭包,结束了这次事件流。

Just Publisher给任何一个Subscriber发送数据都只发送一次,然后就调用Completion

比如修改一下sendMessage方法,添加两次Subscriber

swift 复制代码
func sendMessage() {
  let justPublisher = Just("This is a Just publisher")

  // add first subscriber
  _ = justPublisher
    .sink { completion in
      print("---> Received completion: \(completion)")
    } receiveValue: { value in
      print("---> Received value: \(value)")
    }

  // add second subscriber
  _ = justPublisher
    .sink { completion in
      print("---> 2 Received completion: \(completion)")
    } receiveValue: { value in
      print("---> 2 Received value: \(value)")
    }
}

运行结果如下:

两次订阅的sink方法的回调都被调用了,而且每个Subscriber都只接收到一次数据,然后就调用Completion闭包了。

总的来说,Just Publisher还是比较简单,也比较好理解的。

最后,希望能够帮助到有需要的朋友,如果觉得有帮助,还望点个赞,添加个关注,笔者也会不断地努力,写出更多更好用的文章。

相关推荐
代码s贝多芬的音符2 小时前
ios android 小程序 蓝牙 CRC16_MODBUS
android·ios·小程序
非专业程序员Ping3 小时前
从0到1自定义文字排版引擎:原理篇
ios·swift·assembly·font
2501_915909063 小时前
“绑定 HTTPS” 的工程全流程 从证书配置到真机验证与故障排查
网络协议·http·ios·小程序·https·uni-app·iphone
2501_915918414 小时前
iOS 混淆实战 多工具组合完成 IPA 混淆、加固与工程化落地(iOS混淆|IPA加固|无源码混淆|Ipa Guard|Swift Shield)
android·ios·小程序·https·uni-app·iphone·webview
游戏开发爱好者86 小时前
如何系统化掌握 iOS 26 App 耗电管理,多工具协作
android·macos·ios·小程序·uni-app·cocoa·iphone
2501_915921438 小时前
运营日志驱动,在 iOS 26 上掌握 App 日志管理实践
android·macos·ios·小程序·uni-app·cocoa·iphone
马拉萨的春天9 小时前
iOS的多线程下数据安全和内存泄漏以及工具使用监测内存泄漏
macos·ios·cocoa·多线程
2501_9151063217 小时前
HTTPS 爬虫实战指南 从握手原理到反爬应对与流量抓包分析
爬虫·网络协议·ios·小程序·https·uni-app·iphone
2501_9160074717 小时前
iOS 上架技术支持全流程解析,从签名配置到使用 开心上架 的实战经验分享
android·macos·ios·小程序·uni-app·cocoa·iphone
HarderCoder18 小时前
【Swift 筑基记】把“结构体”与“类”掰开揉碎——从值类型与引用类型说起
swift