RxSwift 压缩后丢失订单
RxSwift lost order after zip
假设我有一个 Observable 和一个 Observable(例如姓名和年龄),我将它们压缩并用它们做一些转换,但压缩包内的那些转换有时我必须去网络( delay 在这个例子中)和其他人只是 return 一个值。所以 tuple(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 { [=10=].0 + " " + [=10=].1.description }
.subscribe { event in
print(event.element ?? "")
}
所以基本上我得到 John 15, Martina 17, FirstName 20
(那些元组是正确的),但我希望 FirstName 20, John 15, Martina 17
.
有解决这个问题的提示吗?我只能想到重新组合它们 (.toArray) 并在内部对它们进行排序,最后 Observable.from
您是否尝试过 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({ [=10=].0 + " " + [=10=].1.description })
.subscribe(onNext: { string in
print(Date().timeIntervalSince1970, string)
})
输出:
1515304227.56596
1515304228.5776 First name 20
1515304228.58187 John 15
1515304228.58236 Martina 17
假设我有一个 Observable 和一个 Observable(例如姓名和年龄),我将它们压缩并用它们做一些转换,但压缩包内的那些转换有时我必须去网络( delay 在这个例子中)和其他人只是 return 一个值。所以 tuple(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 { [=10=].0 + " " + [=10=].1.description }
.subscribe { event in
print(event.element ?? "")
}
所以基本上我得到 John 15, Martina 17, FirstName 20
(那些元组是正确的),但我希望 FirstName 20, John 15, Martina 17
.
有解决这个问题的提示吗?我只能想到重新组合它们 (.toArray) 并在内部对它们进行排序,最后 Observable.from
您是否尝试过 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({ [=10=].0 + " " + [=10=].1.description })
.subscribe(onNext: { string in
print(Date().timeIntervalSince1970, string)
})
输出:
1515304227.56596
1515304228.5776 First name 20
1515304228.58187 John 15
1515304228.58236 Martina 17