rx-swift似乎还没有实现DefaultIfEmpty。有没有其他方法可以模仿这种行为?
let myList:[Int] = []
myList.toObservable()
.switchIfEmpty { () in // <- Not (yet?) implemented
return Observable.of(1)
}.subscribeNext { num in
print(num)
}
// prints 1发布于 2016-10-29 22:18:15
我也有类似的问题,但只需要观察值中的1个值,所以简单的解决方案是串联,然后取1:
yourSingleObservable.concat(Observable.just(defaultValue)).take(1)发布于 2016-02-26 05:58:21
我使用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)发布于 2017-02-11 13:59:56
为了完善米哈尔的说法,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
// -3https://stackoverflow.com/questions/35570959
复制相似问题