拉链后RxSwift丢失了订单

时间:2018-01-06 22:29:16

标签: swift rx-swift

让我说我有一个Observable和一个Observable,(例如名字和年龄),我拉链它们和我做了一些转换,但是这些转换里面的zip有时我必须去网络(延迟这个例子)和其他人只返回一个值。所以元组(String,Int)的原始顺序变得混乱。

var shouldDelay = true
func names() -> Observable<String> {
    return Observable.of("First name", "John", "Martina")
}
func ages() -> Observable<Int> {
    return Observable.of(20,15,17)
}
Observable.zip(names(), ages())
    .flatMap{ arg -> Observable<(String, Int)> in
        if shouldDelay {
            shouldDelay = !shouldDelay
            return Observable.just(arg).delay(1, scheduler: MainScheduler.instance)
        }
        return Observable.just(arg)
    }
    .map { $0.0 + " " + $0.1.description }
.subscribe { event in
    print(event.element ?? "")
}

所以基本上我得到John 15, Martina 17, FirstName 20(那些元组是正确的),但我期待FirstName 20, John 15, Martina 17

有任何提示可以解决这个问题吗?我只能想到重新组合它们(.toArray)并将它们排在内部,最后是Observable.from

1 个答案:

答案 0 :(得分:3)

您是否尝试过concatMap运算符而不是flatMap

print(Date().timeIntervalSince1970)
var shouldDelay = true
func names() -> Observable<String> {
    return Observable.of("First name", "John", "Martina")
}
func ages() -> Observable<Int> {
    return Observable.of(20,15,17)
}
Observable
    .zip(names(), ages())
    .concatMap({ arg -> Observable<(String, Int)> in
        if shouldDelay {
            shouldDelay = !shouldDelay
            return Observable.just(arg).delay(1, scheduler: MainScheduler.instance)
        }
        return Observable.just(arg)
    })
    .map({ $0.0 + " " + $0.1.description })
    .subscribe(onNext: { string in
        print(Date().timeIntervalSince1970, string)
    })

输出:

  

1515304227.56596

     

1515304228.5776名字20

     

1515304228.58187 John 15

     

1515304228.58236 Martina 17