swift - RxSwift 压缩后丢失顺序

标签 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

最佳答案

您是否尝试过 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 First name 20

1515304228.58187 John 15

1515304228.58236 Martina 17

关于swift - RxSwift 压缩后丢失顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48132558/

相关文章:

ios - 无法在 swift 2 中使用 AVCaptureVideoDataOutput 通过 CGDataProviderCopyData 获取像素数据

swift - 使用 iOS 中的事件填充 tableView (swift)

ios - 如何检测 mapView 在 Swift 中移动并更新缩放

swift - RxSwift 异步任务

swift - CocoaPods 更新目标覆盖 `FRAMEWORK_SEARCH_PATHS`

swift - 核心数据 : Converting a String into an NSManagedObject instance

swift - 如何在 RxSwift 上创建 Timer 以每 10 秒调用一次该方法?

ios - 如何在 RxSwift 中使用 CLLocation 扩展

ios - RxCocoa 数据绑定(bind)导致 Collection View 滚动到顶部

ios - 如何在 RXSwift 中对两个公共(public)主题使用combineLatest