首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >DefaultIfEmpty的RxSwift等效项

DefaultIfEmpty的RxSwift等效项
EN

Stack Overflow用户
提问于 2016-02-23 15:07:46
回答 3查看 1.1K关注 0票数 2

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

代码语言:javascript
复制
let myList:[Int] = []
myList.toObservable()
    .switchIfEmpty { () in // <- Not (yet?) implemented
        return Observable.of(1)
    }.subscribeNext { num in
        print(num)
    }

// prints 1
EN

回答 3

Stack Overflow用户

发布于 2016-10-29 22:18:15

我也有类似的问题,但只需要观察值中的1个值,所以简单的解决方案是串联,然后取1:

代码语言:javascript
复制
yourSingleObservable.concat(Observable.just(defaultValue)).take(1)
票数 3
EN

Stack Overflow用户

发布于 2016-02-26 05:58:21

我使用toArray来模拟这种行为。一个使用PublishSubject的示例(我希望可以很容易地转换为使用myList ):

代码语言:javascript
复制
  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)
票数 0
EN

Stack Overflow用户

发布于 2017-02-11 13:59:56

为了完善米哈尔的说法,toArray()提供了一个解决方案:

代码语言:javascript
复制
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)
    }
}

用法:

代码语言:javascript
复制
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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35570959

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档