压缩后 RxSwift 丢失订单

Posted

技术标签:

【中文标题】压缩后 RxSwift 丢失订单【英文标题】:RxSwift lost order after zip 【发布时间】:2018-01-06 22:29:16 【问题描述】:

假设我有一个 Observable 和一个 Observable(例如姓名和年龄),我将它们压缩并用它们进行一些转换,但有时我必须在 zip 中进行这些转换(延迟这个例子)和其他人只是返回一个值。所以 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  $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

【问题讨论】:

只有当shouldDelay 为真时才会发生这种情况? 是的,例如,将延迟视为更新年龄的网络请求,因为它已经过时了(我只是用延迟来模拟它) 【参考方案1】:

您是否尝试过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 约翰 15

1515304228.58236 玛蒂娜 17

【讨论】:

这太棒了。我终于找到了另一个比这更糟糕的解决方案。在 zip 枚举元组之后,然后在最后对其进行排序。非常感谢!

以上是关于压缩后 RxSwift 丢失订单的主要内容,如果未能解决你的问题,请参考以下文章

如何在不覆盖以前数据的情况下使用 rxSwift 压缩、合并或连接?

处理 UITableView 绑定中的连接错误(Moya、RxSwift、RxCocoa)

如何使用 RxSwift 在一个地方捕获来自两个请求的错误

RxSwift - UICollectionView 更新后不更新

使用 RxSwift 刷新后绑定到 UIRefreshControl

观察者在单元格 RxSwift 中处理后仍然接收事件