【问题标题】:Sink does not receive values when connecting to finished a Publisher连接到已完成的 Publisher 时,Sink 未接收到值
【发布时间】:2021-06-18 12:51:58
【问题描述】:

我很难理解为什么在底层代码中没有收到 sink 的值。

func somePublisher() -> AnyPublisher<Bool, Never> {
   let subject = PassthroughSubject<Bool, Never>()
   subject.send(true)
   subject.send(completion: .finished)
   return subject.eraseToAnyPublisher()
}

somePublisher()
   .first()
   .sink { _ in
      print("Completed")
   } receiveValue: {
      print("Received \($0)")
   }
   .store(in: &sinks)

输出:

完成

如果在连接之前完成,发布者似乎不会在流下游接收到值。是对的吗? 如果我的发布者可以同步完成,我该如何解决这个问题?

【问题讨论】:

    标签: swift combine


    【解决方案1】:

    PassthroughSubject 接收一个值并传递它,它不存储该值,因此如果您在传递该值后订阅它,您将不会收到它。

    您可以使用CurrentValueSubject,它将存储最新值并在有人订阅时重新发送。

    如果您发送completion: .finished,那么所有这些都没有实际意义。已完成的发布者不会向订阅者发送任何值,因为它已完成。

    这是你的固定代码:

    func somePublisher() -> AnyPublisher<Bool, Never> {
       let subject = CurrentValueSubject<Bool, Never>(true)
       return subject.eraseToAnyPublisher()
    }
    
    var bag: Set<AnyCancellable> = []
    
    somePublisher()
       .first()
       .sink { _ in
          print("Completed")
       } receiveValue: {
          print("Received \($0)")
       }
       .store(in: &bag)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-12-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多