我有一个变量,它是一个枚举值数组。这些值随时间变化。
enum Option {
case One
case Two
case Three
}
let options = Variable<[Option]>([ .One, .Two, .Three ])
然后我观察这个变量的变化,问题是,我需要知道最新值和前一个值之间的差异,我现在正在做的是:
let previousOptions: [Option] = [ .One, .Two, .Three ]
...
options
.asObservable()
.subscribeNext { [unowned self] opts in
// Do some work diff'ing previousOptions and opt
// ....
self.previousOptions = opts
}
RxSwift中是否有内置的东西可以更好地管理这个问题?是否有一种方法可以总是从信号中获得以前和当前的值?
8条答案
按热度按时间i34xakig1#
下面是一个方便的通用扩展,它应该可以覆盖这些 “我想要以前和当前的值” 用例:
vc6uscn92#
给你
它将返回
Observable<([Options], [Options])>
:)flseospp3#
另一种方式作为延伸
用法:
vjrehmav4#
正如Pham Hoan所说,
scan(_)
是完成这项工作的合适工具,Marin Todorov写了一篇很好的文章。以下是我根据马林的帖子得出的结论:
希望能有所帮助
v9tzhpje5#
.pairwise()
运算符完全符合您的要求,并且是最简单的方法。该运算符将连续发射对组合在一起,并将它们作为两个值的数组发射。参见:www.example.comhttp://reactivex.io/rxjs/class/es6/Observable.js~Observable.html#instance-method-pairwise
或https://rxjs-dev.firebaseapp.com/api/operators/pairwise
更新:正如@courteouselk在他的评论中指出的,我没有注意到这是一个RxSwift问题,我的回答引用了一个RxJS解决方案(哎呀!)
原来RxSwift没有内置的
pairwise
运算符,但是RxSwiftExt提供了一个与内置的RxJS运算符类似的成对扩展运算符。fkvaft9z6#
一条生产线的最佳解决方案:
vsmadaxz7#
我会建议这样的东西(对未来的游客):
r8xiu3jd8#
TL;医生:
如果您想要一个具有
previous
和current
值的元组,而不跳过第一个流事件,也不指定初始值-这里有一个解决方案(在本例中,previous
值是Optional
)。我意识到已经有很多答案了,但当尝试它们时,我似乎总是想要一些稍微不同的东西。
我喜欢元组方法,但我不想错过第一次发射(
skip(1)
)-我看到一些解具有startWith
值,但我想要一个不需要提供初始种子值的解,并且tuple.previous
值为Optional
(表示“尚无先前值”)。这是我的想法,有点冗长(有意地,为了让它更容易阅读,随意缩短语法)。此外,我不得不约束
Element
为Equatable
。也许有更好的方法(请评论),但现在这是我的工作:示例用法:
控制台输出:
作为一个额外的-这里是上面的方法,但是如果它对你的用例有意义的话,它有一个
startWith
值-所以.previous
值不再是Optional
。这与其他人在其他答案中已经建议的是等价的(但是语法更长)。