了解 zip 和 combineLatest 与 RxSwift 之间序列参数的区别

巴特沃米耶·塞曼奇克

我使用了两个函数。第一combineLatest

        enum Weather {
            case cloudy
            case sunny
        }
        let left: Observable<Weather> = Observable.of(.sunny, .cloudy, .cloudy, .sunny)
        let right = Observable.of("Lisbon", "Copenhagen", "London", "Madrid", "Vienna")
        let observable = Observable.combineLatest(left, right) { weather, city in
            return "It's \(weather) in \(city)"
        }
        _ = observable.subscribe(onNext: { value in
            print(value)
        })

带输出:

这是一个在里斯本阳光明媚
它在里斯本阴天
它在哥本哈根阴天
它在哥本哈根阴天
它在伦敦的阴天
天气晴朗在伦敦
天气晴朗马德里
天气晴朗维也纳

zip

        enum Weather {
            case cloudy
            case sunny
        }
        let left: Observable<Weather> = Observable.of(.sunny, .cloudy, .cloudy, .sunny)
        let right = Observable.of("Lisbon", "Copenhagen", "London", "Madrid", "Vienna")
        let observable = Observable.zip(left, right) { weather, city in
            return "It's \(weather) in \(city)"
        }
        _ = observable.subscribe(onNext: { value in
            print(value)
        })

带输出:

里斯本晴天
哥本哈根
阴天 伦敦阴天
马德里晴天

它是如何工作的?我知道 zip 只是将值一对一映射,如果相同索引没有值,则跳过它。但是怎么理解combineLatest呢?

扫地机

combineLatest如果两个 observable 不立即发出元素,则更容易理解(也更有用!)一个更容易理解的例子(我鼓励你尝试)是:

Observable.combineLatest(someUISwitch.rx.isOn, someUITextField.rx.text) { isOn, text in
    return "Text: \(text ?? ""), Switch is on: \(isOn)"
}.subscribe(onNext: { value in
    print(value)
}).disposed(by: disposeBag)

尝试将 aUISwitch和 a添加UITextField到您的 UI 中。现在尝试在文本字段中输入一些文本,并尝试切换开关。你会看到,每当两者之一发生变化时,即当任一 observable 发出一个新值时,它们的组合值(由传递给 的闭包组合combineLatest)由组合的 observable 发出。

更一般地,combineLatest当所有 observables 首先发出一个值时,产生的 observable发出它的第一个值,当任何 observables 发出一个值时,发出后续值。每当它发出一个值时,它发出的值是通过组合所有observables 发出的所有最新值来计算的因此“结合最新”。

对于您的Observable.of示例,所有值都立即发出,但combineLatest表现得好像leftright以隔行扫描顺序发出值,并且left首先发出我试图在你得到的输出中添加注释。看看这是否有助于您的理解。

    (left emits sunny)
    (right emits Lisbon)
It's sunny in Lisbon (the first values emitted by both observables)
    (left emits cloudy)
It's cloudy in Lisbon (latest: cloudy from left)
    (right emits Copenhagen)
It's cloudy in Copenhagen (latest: Copenhagen from right)
    (left emits 2nd cloudy)
It's cloudy in Copenhagen (latest: 2nd cloudy from left)
    (right emits London)
It's cloudy in London (latest: London from right)
    (left emits sunny)
It's sunny in London (latest: sunny from left)
    (right emits Madrid)
It's sunny in Madrid (latest: Madrid from right)
    (right emits Vienna, since left ran out)
It's sunny in Vienna (latest: Vienna from right)

另外,不要忘记您可以使用RxMarbles

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

了解 ~ 和 - 之间的区别

forkjoin 和 combineLatest rxjs 之间的区别

使用RxSwift在CombineLatest中有8个以上的参数

RxSwift地图和flatMap的区别

了解用户“ pi”和root之间的区别

Python:了解附加和扩展之间的区别

真正了解程序和功能之间的区别

试图了解CanActivate和CanActivateChild之间的区别

了解 Viewer 和 ViewingApplication 之间的区别

Observable.CombineLatest绑定并订阅RxSwift

关于 RxSwift/RxCocoa 与 combineLatest 绑定的问题

在rxswift中,我无法将一个参数发送到CombineLatest。一个参数应该使用什么?

CombineLatest和异步管道

了解Object.create()和new SomeFunction()之间的区别

了解EMC ECS和EMC ScaleIO之间的区别

如何了解elf程序头中的Offset和VirAddr之间的区别?

了解溢出和进位标志之间的区别

了解flex和flex-grow属性之间的区别

了解__getattr__和__getattribute__之间的区别

了解Java中null和'\ u000'之间的区别

如何使Firefox了解箭头键与%和'之间的区别

了解`load`,`require`和`require_relative`之间的区别

了解this.function()和this.function之间的区别

了解堆上静态和非静态方法表示之间的区别

使用__repr __()了解双引号和单引号之间的区别

使用Pellet了解SPARQL和语义推理之间的区别

了解permitAll()和匿名()在Spring Security的区别

python 2和python 3中zip()函数之间的区别

Rxswift Observable.of和Observable <String> .create之间有什么区别