【问题标题】:Is there a way to make a signal similar to combineLatest without needing all the signals to initially fire?有没有办法在不需要所有信号最初触发的情况下制作类似于 combineLatest 的信号?
【发布时间】:2018-07-26 01:48:34
【问题描述】:

我有一个信号数组

var signals = [Signal<ActionResult?, NoError>]()

在哪里

enum ActionResult
    case failed
    case pending
    case completed
}

我想创建一个组合信号,如果一个或多个信号触发.pending,则返回 true

let doesAnyOfTheActionsLoad = Signal.combineLatest(signals).map { values in

     values.reduce(false, { (result, nextResult) -> Bool in
         if result == true { return true }

             if case .pending? = nextResult {
                 return true
             }
         return false
     })
}

我唯一的问题是,combineLatest 只有在所有信号都至少触发一次时才会触发,并且无论是否所有信号都已触发,我都需要触发我的信号。有没有办法在 ReactiveSwift 中做到这一点?

【问题讨论】:

    标签: swift reactive-swift combinelatest


    【解决方案1】:

    试试这个:

     let doesAnyOfTheActionsLoad = Signal.merge(signals).map { $0 == .pending}
    

    【讨论】:

      【解决方案2】:

      如果您希望信号在一个.pending 之后保持为真,那么您需要使用scan 运算符之类的东西来存储当前状态:

      let doesAnyOfTheActionsLoad = Signal.merge(signals).scan(false) { state, next in
          if case .pending? = next {
              return true
          }
          else {
              return state
          }
      }
      

      scan 就像reduce 的“实时”响应式版本;每次有新值进入并累积时,它都会发送当前结果。

      【讨论】:

        【解决方案3】:

        其他解决方案在技术上是正确的,但我认为这可能更适合您的用例。

        // Only ever produces either a single `true` or a single `false`.
        let doesAnyOfTheActionsLoad = 
            SignalProducer<Bool, NoError>
                .init(signals)
                .flatten(.merge) // Merge the signals together into a single signal.
                .skipNil() // Discard `nil` values.
                .map { $0 == .pending } // Convert every value to a bool representing whether that value is `.pending`.
                .filter { $0 } // Filter out `false`.
                .concat(value: false) // If all signals complete without going to `.pending`, send a `false`.
                .take(first: 1) // Only take one value (so we avoid the concatted value in the case that something loads).
        

        【讨论】:

        • 不错的解决方案,唯一的问题是 .map { $0 == .pending } 不适用于可选的情况,你知道一个类似的简写方式适用于可选的枚举值吗?
        • 编辑以首先过滤掉选项
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-03-13
        • 2019-11-12
        • 1970-01-01
        • 1970-01-01
        • 2016-11-06
        • 2020-12-08
        • 1970-01-01
        相关资源
        最近更新 更多