debug: multicast triggered..
只打印一次。既然苹果说
multicast(_:)
为每个订阅者创建一个新的发布者,那么打印语句不应该被触发两次吗?
import Foundation
import Combine
var cancellables = Set<AnyCancellable>()
let upstreamPublisher = Range(1...3).publisher.delay(for: 1, scheduler: DispatchQueue.main)
let sharedSubject = CurrentValueSubject<Int, Never>(-1)
// Create a multicast publisher and apply autoconnect
let multicastPublisher = upstreamPublisher
.multicast({
print("debug: multicast triggered..")
return sharedSubject
})
.autoconnect()
// Subscriber 1
multicastPublisher
.sink { value in
print("Subscriber 1 received value: \(value)")
}
.store(in: &cancellables)
// Subscriber 2
multicastPublisher
.sink { value in
print("Subscriber 2 received value: \(value)")
}
.store(in: &cancellables)
// Output
//debug: multicast triggered..
//Subscriber 1 received value: -1
//Subscriber 2 received value: -1
//Subscriber 1 received value: 1
//Subscriber 2 received value: 1
//Subscriber 1 received value: 2
//Subscriber 2 received value: 2
//Subscriber 1 received value: 3
//Subscriber 2 received value: 3
multicast(_:)
闭包。 (“每次订阅者附加到多播发布者时创建一个新主题”的整个概念似乎完全违背了多播的目的,即您只需要调用一次发布者的
receive<S>(subscriber:)
方法。)在我看来,这看起来像是文档中的一个错误:
multicast(subject:)
和
multicast(_:)
之间的区别似乎很简单,一个接受一个
Subject
参数,一个接受一个闭包。
autoconnect()
,而是推迟
connect
,直到添加了所有订阅者:
var cancellables = Set<AnyCancellable>()
let upstreamPublisher = Range(1...3).publisher.delay(for: 1, scheduler: DispatchQueue.main)
// Create a multicast publisher and apply autoconnect
let multicastPublisher = upstreamPublisher
.multicast {
print("debug: multicast triggered..")
return PassthroughSubject<Int, Never>()
}
// Subscriber 1
multicastPublisher
.sink { value in
print("Subscriber 1 received value: \(value)")
}
.store(in: &cancellables)
// Subscriber 2
multicastPublisher
.sink { value in
print("Subscriber 2 received value: \(value)")
}
.store(in: &cancellables)
// Connect
multicastPublisher.connect()
.store(in: &cancellables)
multicast
函数返回“可连接”发布者的要点是,您可以将连接推迟到代码中的某个未来点。这也消除了对
CurrentValueSubject
的需要(尽管如果需要,您应该随意使用它)。但是,这就是为什么我使用上面的
PassThroughSubject
。结果:
debug: multicast triggered..
Subscriber 2 received value: 1
Subscriber 1 received value: 1
Subscriber 2 received value: 2
Subscriber 1 received value: 2
Subscriber 2 received value: 3
Subscriber 1 received value: 3