RxSwift使用技巧之过滤操作详解
上图对应代码: let strikes = PublishSubject<String>() let disposeBag = DisposeBag() strikes .take(2) .subscribe(onNext: { print($0) }) .addDisposableTo(disposeBag) strikes.onNext("1") strikes.onNext("2") strikes.onNext("3") strikes.onCompleted() /* 打印结果 1 2 */ 除此之外,skipWhile 也有对应的 Take 操作 takeWhile ,两者的代码结构几乎一致只不过前者是跳过操作而后者则是响应操作。不过这里我不准备介绍 takeWhile 操作(可以自己动手试下),而是介绍 takeWhile 变种 takeWhileWithIndex。其实函数名已经表明了该操作的主要功能,在 takeWhile 的基础上会加上索引 index 参数。因为有时候我们除了需要通过 value 进行过滤判断外,索引 index 也可能是一个判断维度。下图就展示了 takeWhileWithIndex 简单使用示例,对于 value 和 index 值小于 1 的事件全部跳过。 图示对应代码: let strikes = PublishSubject<Int>() let disposeBag = DisposeBag() strikes .takeWhileWithIndex { integer,index in integer > 1 && index > 1 } .subscribe(onNext: { print( "($0)") }) .addDisposableTo(disposeBag) strikes.onNext(1) strikes.onNext(2) strikes.onNext(3) strikes.onCompleted() /* 打印结果 3 */ 其实 Skip 组中同样存在与 takeWhileWithIndex 相对的 skipWhileWithIndex ,感兴趣可以自己检验一下。接下来我们介绍 Take 组中的最后一个操作 takeUntil 。同样地该操作是 skipUntil 的反操作,直到另一个实例对象触发后该实例对象的观察者才会停止响应。下图就是 takeUntil 操作的一个简单示例,作为观察者第三行会一直响应第一行可观察对象发送的数据,直到第二行对象触发后才停止。 对应代码: let strikes = PublishSubject<String>() let trigger = PublishSubject<String>() let disposeBag = DisposeBag() strikes .takeUntil(trigger) .subscribe(onNext: { print($0) }) .addDisposableTo(disposeBag) strikes.onNext("1") strikes.onNext("2") trigger.onNext("X") strikes.onNext("3") strikes.onCompleted() /* 打印结果 1 2 */ Distinct 过滤 最后本文将介绍 Distinct 过滤操作 distinctUntilChanged 。对于观察者来说,有时可观察对象可能在某段时间内连续发生相同的数据。假设这些数据与 UI 相关的话,那么这里就存在不必要的刷新操作了。所以我们有必要对过滤这些连续的相同数据,减少不必要的响应操作。下图就是一个简单的示例,图中我们过滤掉了相同的后续数据,只会对第一个作出响应。 对应示例代码: let strikes = PublishSubject<String>() let disposeBag = DisposeBag() strikes .distinctUntilChanged() .subscribe(onNext: { print($0) }) .addDisposableTo(disposeBag) strikes.onNext("1") strikes.onNext("2") strikes.onNext("2") strikes.onNext("3") strikes.onCompleted() /* 打印结果 1 2 3 */ 总结 本文在前面的基础上通过图示和代码介绍了主要的过滤操作。掌握好这些操作有利于我们最大化的发挥 RxSwift 功力。当然文中的代码都非常简单,所以我希望你在实际编程中不断磨练。 好了,以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对编程小技巧的支持。 (编辑:晋中站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |