Swift Couple:多播(_:) 会为每个订阅者创建一个新主题

问题描述 投票:0回答:1
在这段代码中,为什么当有 2 个订阅者时

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
    
swift combine
1个回答
0
投票
经过多次测试,我没有看到它多次调用

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
    
© www.soinside.com 2019 - 2024. All rights reserved.