连接到完成的发布者时,接收器不接收值

时间:2021-06-18 12:51:58

标签: swift combine

我很难理解为什么在底层代码中没有收到 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)

输出:

<块引用>

已完成

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

1 个答案:

答案 0 :(得分:2)

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)