【问题标题】:RxSwift: Use Zip with different type observablesRxSwift:使用 Zip 和不同类型的 observables
【发布时间】:2016-03-09 19:32:07
【问题描述】:

我正在使用 RxSwift 2.0.0-beta

如何以类似 zip 的方式组合 2 个不同类型的 observable?

// This works
[just(1), just(1)].zip { intElements in
    return intElements.count
}

// This doesn't
[just(1), just("one")].zip { differentTypeElements in 
    return differentTypeElements.count
}

我目前的解决方法是将所有内容映射到组合类型的可选元组,然后将可选元组压缩成非可选元组。

    let intObs = just(1)
        .map { int -> (int: Int?, string: String?) in
            return (int: int, string: nil)
    }
    let stringObs = just("string")
        .map { string -> (int: Int?, string: String?) in
        return (int: nil, string: string)
    }
    [intObs, stringObs].zip { (optionalPairs) -> (int: Int, string: String) in
        return (int: optionalPairs[0].int!, string: optionalPairs[1].string!)
    }

这显然很丑陋。有什么更好的方法?

【问题讨论】:

    标签: swift rx-swift


    【解决方案1】:

    这对我有用。我在 Xcode7 中测试过,RxSwift-2.0.0-beta

    zip(just(1), just("!")) { (a, b) in 
        return (a,b)
    }
    

    【讨论】:

    • 噢!我坚持使用集合类型扩展 zip 而不仅仅是常规的zip。谢谢!
    • 假设 zip 是同步的是否安全?
    【解决方案2】:

    这里是如何使它适用于 RxSwift 2.3+

    Observable.zip(Observable.just(1), Observable.just("!")) {
        return ($0, $1)
    }
    

    Observable.zip(Observable.just(1), Observable.just("!")) {
        return (anyName0: $0, anyName1: $1)
    }
    

    【讨论】:

      【解决方案3】:

      如果你使用 Singles (RxSwift 5.0+)

      Single.zip(single1, single2) {
          return ($0, $1)
      }
      

      Observable.zip(single1.asObservable(), single2.asObservable()) {
          return ($0, $1)
      }
      

      例子:

      let task = Single
                      .zip(repository.getArrayA(), repository.getArrayB())
                      { (a: [A], b: [B]) in
                          return (a, b)
                      }                    
                      .do(onSuccess: { (zip) in
                      let (a, b) = zip
      
                      // your code
      
                      //example: self.updateSomething(a, b)
      
                  })
                  .asCompletable()
      

      【讨论】:

        猜你喜欢
        • 2016-12-27
        • 1970-01-01
        • 2016-06-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-07
        • 1970-01-01
        相关资源
        最近更新 更多