连接到完成的 Publisher 时,Sink 不接收值
Sink does not receive values when connecting to finished a Publisher
我很难理解为什么在底层代码中 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 \([=10=])")
}
.store(in: &sinks)
输出:
Completed
如果它在连接之前完成,那么下游的发布者似乎没有收到值。那正确吗?
如果我的发布者可以同步完成,我该如何解决这个问题?
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 \([=10=])")
}
.store(in: &bag)
我很难理解为什么在底层代码中 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 \([=10=])")
}
.store(in: &sinks)
输出:
Completed
如果它在连接之前完成,那么下游的发布者似乎没有收到值。那正确吗? 如果我的发布者可以同步完成,我该如何解决这个问题?
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 \([=10=])")
}
.store(in: &bag)