RxSwift相当于DefaultIfEmpty

时间:2016-02-23 07:07:46

标签: swift rx-swift

似乎rx-swift还没有实现DefaultIfEmpty。还有其他方法可以模仿这种行为吗?

del request.session['result']

3 个答案:

答案 0 :(得分:1)

我有类似的问题,但只需要一个来自observable的值,所以简单的解决方案是连接而不是1:

open Players;;

let () =
    let mgr = new player_manager

答案 1 :(得分:0)

我使用toArray来模仿这种行为。使用PublishSubject的示例(我希望可以轻松转换为使用myList):

  let subjectInt = PublishSubject<Int>()
  let emptyReplacement = subjectInt
    .toArray()
    .filter {$0.isEmpty}
    .map{ _ in return 42}

  let defaultIfEmpty = [subjectInt, emptyReplacement].toObservable().merge()

  defaultIfEmpty.subscribeNext {
    print("defaultIfEmpty: \($0)")
  }

  subjectInt.on(.Next(11)) // 
  subjectInt.on(.Next(33)) //comment these 2 lines out to see the default value 42 printed
  subjectInt.on(.Completed)

答案 2 :(得分:0)

要完善Michal所说的内容,toArray()提供了解决方案:

extension Observable {
    func defaultIfEmpty(_ other: Observable<E>) -> Observable<E> {
        let replacement = toArray()
            .flatMap { array -> Observable<E> in
                if array.isEmpty {
                    return other
                } else {
                    return Observable.empty()
                }
            }

        return concat(replacement)
    }
}

用法:

let a = Observable.of(1, 2, 3)
let b = Observable.of(-1, -2, -3)
let c = Observable<Int>.of()

_ = a.defaultIfEmpty(b).subscribe(onNext: { print($0) })

// 1
// 2
// 3

_ = c.defaultIfEmpty(b).subscribe(onNext: { print($0) })

// -1
// -2
// -3