Swift Combine:将一个发布者的输出直接输出到另一个发布者的输入

Ric*_*hiy 4 publisher ios swift combine

考虑以下综合场景:

import Combine

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


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

Run Code Online (Sandbox Code Playgroud)

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

注: 和publisher1均为publisher2同一类型。

问题的详细信息

publisher2是“核心”类公开的 API 的一部分。“核心”类与“子”类具有“具有”关系,而“子”类又具有publisher1API。

在“核心”类的生命周期中,“子”类可以多次分配和释放。这对于“核心”类的订阅者来说应该是透明的,他们不需要订阅publisher2.

代码:

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)
        }
    }
}

Run Code Online (Sandbox Code Playgroud)

尝试将一个发布者订阅到另一个发布者不起作用:

publisher2
    .subscribe(publisher1)

Run Code Online (Sandbox Code Playgroud)

对实例方法“订阅”的调用没有完全匹配

在此输入图像描述

mat*_*att 7

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

所以就说

publisher1.subscribe(publisher2)
Run Code Online (Sandbox Code Playgroud)

一切就绪。