Advertisement

Swift Combine — JUST Publisher

阅读量:

过去的文章对Publisher进行了阐述,并说明它们能够持续不断地传递数据流给Subscriber. 通常情况下, Subscriber会一直接收这些数据流,除非接收到finishederror标志而终止接收. 与之不同的是, JUST Publisher仅向每个订阅者发送一次输出,之后就不再继续.

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

复制代码
    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())
    }
      }
    }

在这段代码中新增了一个名为sendMessage的方法,在该函数体内生成了一个Just发布者,并将要发送的数据传递给它。接着使用sink()接口注册订阅者。

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

在这里插入图片描述

显然,在点击触发后,在初始化阶段发送了初始数据;接着又触发了完成处理流程。

Just Publisher仅向每个Subscriber发送一次数据后即调用Completion。
例如,在(sendMessage)方法中添加两个Subscriber实例。

复制代码
    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仅接收了一次数据, 并且之后立即执行了```

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

最后

最后

全部评论 (0)

还没有任何评论哟~