我们什么时候应该使用Combine的多播autoconnect()

问题描述 投票:0回答:1

我有这个代码

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.
。第一部分对我来说有意义,但我不知道这句话的第二部分的真正含义。我们如何与当前值主题和自动连接共享结果?

swift combine reactivex
1个回答
0
投票

我们如何与当前值主题和自动连接共享结果?

这已经是你的代码正在做的事情了!

我假设您希望订阅者 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

© www.soinside.com 2019 - 2024. All rights reserved.