我有一个流程,可以转换数据,对其进行操作,再次对其进行转换并对其进行操作。例如:
// Current code
Just(0)
.map({ $0 + 1 })
.map({ funcX($0); return $0 })
.map({ $0 + 1 })
.map({ funcY($0); return $0 })
...
我知道反应式编程是关于流的,但是我想调用funcX
而无需返回值。是否存在传递值并自动传递值的函数?像这样:
// Hypothetical
Just(0)
.map({ $0 + 1 })
.call({ funcX($0) })
.map({ $0 + 1 })
.call({ funcY($0) })
...
注意:上面的介绍需要更多语法来实际编译,这只是一个示例。
答案 0 :(得分:2)
您当然可以编写自己的运算符,但是对我来说,有一个基于默认运算符的简单方法,具有处理程序,例如:
extension Publisher { /// Republishes all elements that match a provided closure. /// /// - Parameter isIncluded: A closure that takes one element and returns a Boolean value indicating whether to republish the element. /// - Returns: A publisher that republishes all elements that satisfy the closure. public func filter(_ isIncluded: @escaping (Self.Output) -> Bool) -> Publishers.Filter<Self>
所以你的情况看起来像
.filter({ funcX($0); return true })
因此,您具有透明的流,并且可以对“下游”值执行任何回调。
您甚至可以将其包裹起来
extension Publisher {
public func call(_ closure: @escaping (Self.Output) -> Void) -> Publishers.Filter<Self> {
return self.filter({ closure($0); return true })
}
}
答案 1 :(得分:2)
不需要自定义运算符,它已经存在:getGroups
handleEvents
Just(0)
.map({ $0 + 1 })
.handleEvents(receiveOutput: { funcX($0) })
.map({ $0 + 1 })
.handleEvents(receiveOutput: { funcY($0) })
...
运算符可以使用其可选参数插入发布者/订阅者生命周期的任何部分:
receiveSubscription
receiveRequest
receiveCancel
receiveOutput
receiveCompletion