我使用了两个函数。第一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
表现得好像left
并right
以隔行扫描顺序发出值,并且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] 删除。
我来说两句