【问题标题】:In Combine how do you make a publisher that sends one value but never completes?在 Combine 中,您如何创建一个发送一个值但从未完成的发布者?
【发布时间】:2020-05-26 04:07:56
【问题描述】:

在 Combine 中,您如何创建一个发送一个值但从未完成的发布者?

在下面的代码中,receiveCompletion 被调用,但我不希望它:

Just(1)
    .sink(
        receiveCompletion: {
            print("Completion: \($0)")
    },
        receiveValue: {
            print("Value: \($0)")
    }
)

我怎样才能只发出一个值但不完整...?

【问题讨论】:

    标签: swift combine


    【解决方案1】:

    您可以将Empty(completeImmediately: false) 附加到任何发布者以防止其正常完成。

    Just(1)
        .append(Empty(completeImmediately: false))
        .sink(
            receiveCompletion: { print("completion: \($0)") },
            receiveValue: { print("value: \($0)") })
    

    【讨论】:

      【解决方案2】:

      可能有一些更好的方法,但CurrentValueSubject 永远不会碰它的value,会按您的预期工作:

      let publisher = CurrentValueSubject<Int, Never>(1)
      
      publisher
          .sink(
              receiveCompletion: {
                  print("Completion: \($0)")
          },
              receiveValue: {
                  print("Value: \($0)")
          }
      )
      

      输出:

      Value: 1
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-11-08
        • 2020-08-05
        • 1970-01-01
        • 1970-01-01
        • 2021-08-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多