在 RxSwift 中具有来自 Observable 的最后两个元素的运算符

Posted

技术标签:

【中文标题】在 RxSwift 中具有来自 Observable 的最后两个元素的运算符【英文标题】:Operator with two last elements from Observable in RxSwift 【发布时间】:2019-10-23 07:05:34 【问题描述】:

我有一个Ints 的可观察序列:

-1-2-3-4-5-6-3-4-5-1-

例如,我需要检测前一个元素何时大于最后一个。

在这个序列中它是(6, 3)(5, 1)

-1-2-3-4-5-6-3-4-5-1-
-------------ˆ-----ˆ-

在这种情况下我可以使用哪个运算符?

【问题讨论】:

可以scan运营商帮忙吗? 【参考方案1】:

是的scan是您要找的接线员:

let stream = Observable<Int>.from([1, 2, 3, 4, 5, 6, 3, 4, 5, 1])
let seed = (0, 0) // (any Int, Int that smaller of all possible values of first emited Int)
let wrongPairs = stream
    .scan(seed)  last, new -> (Int, Int) in
        return (last.1, new)
    
    .filter  $0.0 > $0.1 

使用scan,我们将Ints 的流映射到Int 对的流,然后过滤所有“好”的对(如果小于或等于前一个元素):

-1-2-3-4-5-6-3-4-5-1-
-(0, 1)-(1, 2)-(2, 3)-(3, 4)-(4, 5)-(5, 6)-(6, 3)-(3, 4)-(4, 5)-(5, 1)-
-(6, 3)-(5, 1)-

scan 的缺点是您需要以初始数字开头,这在某些情况下可能会出现问题,但如果您的流始终发出正数 -1 将起作用。

【讨论】:

以上是关于在 RxSwift 中具有来自 Observable 的最后两个元素的运算符的主要内容,如果未能解决你的问题,请参考以下文章

压缩后 RxSwift 丢失订单

RxSwift基本使用

使用 RXSwift 的警报消息的 UIViewController 扩展

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

RxSwift - 来自 Singleton 的不同类型的队列 observables

来自数组的 RxSwift 可观察对象序列