是否有执行并传递原始值的反应功能?

时间:2019-12-01 05:49:40

标签: swift reactive-programming combine

我有一个流程,可以转换数据,对其进行操作,再次对其进行转换并对其进行操作。例如:

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

注意:上面的介绍需要更多语法来实际编译,这只是一个示例。

2 个答案:

答案 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