RxSwift 地图和 flatMap

问题描述 投票:0回答:1

为什么两种方法的输出不同?这是什么原因呢?

当我使用不同的运算符组合时,我期望得到相同的输出,但结果不是我期望的。我想知道这里使用map和使用flatMap之间的区别,以及为什么它会导致不同的输出

func test1() {
        let sb1 = RxRelay.BehaviorRelay(value: true)
        let sb2 = RxRelay.BehaviorRelay(value: 0)
        Observable.combineLatest(sb1, sb2)
            .filter {
                print("---filter----------")
                return $0 && $1 != -1
            }
            .debug("---debug")
            .observe(on: MainScheduler.asyncInstance)
            .take(1).map { $1 }
            .do(onNext: {
                print("---next value \($0)")
            })
            .do(onCompleted: {
                print("---send next")
                sb2.accept(12)
            })
            .subscribe()
            .disposed(by: disposeBag)
    }
    
    func test2() {
        let sb1 = RxRelay.BehaviorRelay(value: true)
        let sb2 = RxRelay.BehaviorRelay(value: 0)
        Observable.combineLatest(sb1, sb2)
            .filter {
                print("---filter----------")
                return $0 && $1 != -1
            }
            .debug("---debug")
            .observe(on: MainScheduler.asyncInstance)
            .take(1).flatMap { Observable.just($1) }
            .do(onNext: {
                print("---next value \($0)")
            })
            .do(onCompleted: {
                print("---send next")
                sb2.accept(12)
            })
            .subscribe()
            .disposed(by: disposeBag)
    }
rx-swift
1个回答
0
投票

您看到的问题是因为中继及其派生的主题不是线程安全的。

解决方案是将

observe(on:)
运算符推得尽可能低;在本例中,位于
do(onCompleted:)
之前。这将确保同步处理尽可能多的流。

这是《Rx 简介》一书中的一般指南。

© www.soinside.com 2019 - 2024. All rights reserved.