Swift Combine:一个 Publisher 的直接输出到另一个 Publisher 的输入

Swift Combine: direct output of one Publisher to the input of another

考虑以下综合场景:

import Combine

let publisher1 = PassthroughSubject<Int, Never>().eraseToAnyPublisher()
let publisher2 = PassthroughSubject<Int, Never>()


publisher1.sink { value in
    publisher2.send(value)
}

我们有 2 个发布者,我想将 publisher1 的任何值传播到 publisher2。我展示的代码可以完成这项工作,但我感兴趣的是是否有更清晰的声明式方法。

注意:publisher1publisher2是同一类型。

问题详情

publisher2是API的一部分,被“核心”class暴露出来。 “核心”class 与“子”class 有“关系”,后者又具有 publisher1,因为它是 API。

在“核心”class 的生命周期内,“子”class 可以分配和释放多次。这对于不需要订阅 publisher2.

的“核心”class 的订阅者来说应该是透明的

代码:

import UIKit
import Combine


class ChildClass {
    let publisher1 = PassthroughSubject<Int, Never>().eraseToAnyPublisher()
}

class CoreClass {
    let publisher2 = PassthroughSubject<Int, Never>()

    private var childClass: ChildClass?

    init() {
        allocateChildClass()
    }

    func allocateChildClass() {
        let child = ChildClass()
        childClass = child
        // Any way to simplify this?
        child.publisher1.sink { value in
            publisher2.send(value)
        }
    }

    func deallocateChildClass() {
        childClass = nil
    }
}


class Client {
    let core = CoreClass()

    init() {
        // Doesn't care about allocating or deallocating of the ChildClass
        core.publisher2.sink { value in
            print(value)
        }
    }
}

尝试将一个发布者订阅到另一个发布者无效:

publisher2
    .subscribe(publisher1)

No exact matches in call to instance method 'subscribe'

PassthroughSubject 的一个令人愉快的特性是它既是发布者又是操作者:Subject 可以直接链接到管道。

所以就说

publisher1.subscribe(publisher2)

一切就绪。