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)
对实例方法“订阅”的调用没有完全匹配
PassthroughSubject 的一个令人愉快的功能是它既是发布者又是操作者:Subject 可以直接链接到管道。
所以就说
publisher1.subscribe(publisher2)
Run Code Online (Sandbox Code Playgroud)
一切就绪。