我有这个代码
import Foundation
import Combine
let upstreamPublisher = Just("Hello, World!")
let sharedSubject = CurrentValueSubject<String, Never>("initial value")
// Create a multicast publisher and apply autoconnect
let multicastPublisher = upstreamPublisher
.multicast(subject: sharedSubject)
.autoconnect()
// Subscriber 1
multicastPublisher
.sink { value in
print("Subscriber 1 received value: \(value)")
}
// Subscriber 2
multicastPublisher
.sink { value in
print("Subscriber 2 received value: \(value)")
}
输出为:
Subscriber 1 received value: initial value
Subscriber 1 received value: Hello, World!
我从一篇文章中读到
The first time you subscribe to it, it connects to the upstream publisher and starts the work immediately. This is useful in scenarios where the upstream publisher emits a single value and you can use a CurrentValueSubject to share it with subscribers.
。第一部分对我来说有意义,但我不知道这句话的第二部分的真正含义。我们如何与当前值主题和自动连接共享结果?
我们如何与当前值主题和自动连接共享结果?
这已经是你的代码正在做的事情了!
我假设您希望订阅者 2 也收到初始值和“Hello, World!”,即这样的输出
Subscriber 1 received value: initial value
Subscriber 2 received value: initial value
Subscriber 2 received value: Hello, World!
Subscriber 1 received value: Hello, World!
这不会发生,因为
Just
同步发布。一旦您拨打 sink
,订阅者就会自动连接到 multicast
(因为 autoconnect
)。结果,Just
发布了它的值并立即完成。当您添加第二个订阅者时,一切都已完成,并且不会收到任何内容。
您可以通过在
.print("Subscriber 2")
之前添加 sink
来看到这种情况的发生。输出是:
Subscriber 2: receive subscription: (Multicast)
Subscriber 2: request unlimited
Subscriber 2: receive finished
如果将上游变成不异步发布值的发布者,例如网络请求、计时器、
delay
等,然后两个订阅者都会获得值:
let upstreamPublisher = Just("Hello, World!")
.delay(for: 1, scheduler: DispatchQueue.main)
确保您将
AnyCancellable
的引用存储在某处,否则发布者将在“Hello, World!”之前被取消。已发布!
当然,总是可以选择手动调用
connect
。