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
。我展示的代码可以完成这项工作,但我感兴趣的是是否有更清晰的声明式方法。
注意:publisher1
和publisher2
是同一类型。
问题详情
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)
一切就绪。
考虑以下综合场景:
import Combine
let publisher1 = PassthroughSubject<Int, Never>().eraseToAnyPublisher()
let publisher2 = PassthroughSubject<Int, Never>()
publisher1.sink { value in
publisher2.send(value)
}
我们有 2 个发布者,我想将 publisher1
的任何值传播到 publisher2
。我展示的代码可以完成这项工作,但我感兴趣的是是否有更清晰的声明式方法。
注意:publisher1
和publisher2
是同一类型。
问题详情
publisher2
是API的一部分,被“核心”class暴露出来。 “核心”class 与“子”class 有“关系”,后者又具有 publisher1
,因为它是 API。
在“核心”class 的生命周期内,“子”class 可以分配和释放多次。这对于不需要订阅 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)
}
}
}
尝试将一个发布者订阅到另一个发布者无效:
publisher2
.subscribe(publisher1)
No exact matches in call to instance method 'subscribe'
PassthroughSubject 的一个令人愉快的特性是它既是发布者又是操作者:Subject 可以直接链接到管道。
所以就说
publisher1.subscribe(publisher2)
一切就绪。