RxSwift|RxSwift 过滤操作符(Filtering Observables)
过滤操作指的是从源Observable
中选择特定的数据发送。
1. filter
filter
操作符将通过你提供的判定方法过滤一个Observable
。
文章图片
filter.png
let disposeBag = DisposeBag()
Observable.of(2, 30, 22, 5, 60, 1)
.filter{ $0 > 10 }
.subscribe(onNext: { print( $0 )})
.disposed(by: disposeBag)
输出结果:
30
22
60
2. distinctUntilChanged
distinctUntilChanged
操作符将阻止Observable
发出相同的元素。如果后一个元素和前一个元素是相同的,那么这个元素将不会被发出来。如果后一个元素和前一个元素不相同,那么这个元素才会被发出来。文章图片
distinctUntilChanged.png
let disposeBag = DisposeBag()
Observable.of(1, 2, 2, 1, 3)
.distinctUntilChanged()
.subscribe(onNext: { print($0) })
.disposed(by: disposeBag)
输出结果:
1
2
1
3
3. single
- 限制只发送一次事件,或者满足条件的第一个事件。
- 如果存在有多个事件或者没有事件都会发出一个
error
事件。 - 如果只有一个事件,则不会发出
error
事件
文章图片
single.png
let disposeBag = DisposeBag()
Observable.of(1, 2, 3, 4, 4, 4, 5)
.single()
.subscribe(onNext: {print($0)})
.disposed(by: disposeBag)Observable.of("A")
.single()
.subscribe(onNext: {print($0)})
.disposed(by: disposeBag)
结果如下:
1
Unhandled error happened: Sequence contains more than one element.
subscription called from:
A
4. elementAt
elementAt
操作符将拉取Observable
序列中指定索引数的元素,然后将它作为唯一的元素发出。文章图片
elementAt.png
let disposeBag = DisposeBag()
Observable.of(1, 2, 3, 4)
.elementAt(2)
.subscribe(onNext: {print($0)})
.disposed(by: disposeBag)
结果如下:
3
5. ignoreElements
- 该操作符可以忽略掉所有的元素,只发出
error
或completed
事件。 - 如果我们并不关心
Observable
的任何元素,只想知道Observable
在什么时候终止,那就可以使用ignoreElements
操作符。
文章图片
ignoreElements.png
let disposeBag = DisposeBag()
Observable.of(1, 2, 3, 4, 4, 4, 5)
.ignoreElements()
.subscribe{ print($0) }
.disposed(by: disposeBag)
结果如下:
completed
6.take 该方法实现仅发送
Observable
序列中的前n
个事件,在满足数量之后会自动.completed
文章图片
take.png
let disposeBag = DisposeBag()
Observable.of(1, 2, 3, 4)
.take(2)
.subscribe(onNext: {print($0)})
.disposed(by: disposeBag)
结果如下:
1
2
7. takeLast 【RxSwift|RxSwift 过滤操作符(Filtering Observables)】该方法实现仅发送
Observable
序列中的后n
个事件文章图片
takeLast.png
let disposeBag = DisposeBag()
Observable.of(1, 2, 3, 4)
.takeLast(1)
.subscribe(onNext: {print($0)})
.disposed(by: disposeBag)
结果如下:
4
8. skip 该方法用于跳过源
Observable
序列发出的前n
个事件。文章图片
skip.png
let disposeBag = DisposeBag()
Observable.of(1, 2, 3, 4)
.skip(2)
.subscribe(onNext: { print($0) })
.disposed(by: disposeBag)
结果如下:
3
4
9. Sample
-
Sample
除了订阅源Observable
外,还可以监视另外一个Observable
, 即notifier
。
每当收到notifier
事件,就会从源序列取一个最新的事件并发送。而如果两次notifier
事件之间没有源序列的事件,则不发送值。
文章图片
sample.png
let disposeBag = DisposeBag()let source = PublishSubject()
let notifier = PublishSubject()source.sample(notifier)
.subscribe(onNext: {print($0)})
.disposed(by: disposeBag)source.onNext(1)notifier.onNext("A")source.onNext(2)notifier.onNext("B")
notifier.onNext("C")source.onNext(3)
source.onNext(4)notifier.onNext("D")source.onNext(5)notifier.onCompleted()
结果如下:
1
2
4
5
10. debounce
-
debounce
操作符可以用来过滤掉高频产生的元素,它只会发出这种元素:该元素产生后,一段时间内没有新元素产生。 - 换句话说就是,队列中的元素如果和下一个元素的间隔小于了指定的时间间隔,那么这个元素将被过滤掉。
-
debounce
常用在用户输入的时候,不需要每个字母敲进去都发送一个事件,而是稍等一下取最后一个事件。
文章图片
debounce.png
let disposeBag = DisposeBag()//定义好每个事件里的值以及发送的时间
let times = [
[ "value": 1, "time": 0.1 ],
[ "value": 2, "time": 1.1 ],
[ "value": 3, "time": 1.2 ],
[ "value": 4, "time": 1.2 ],
[ "value": 5, "time": 1.4 ],
[ "value": 6, "time": 2.1 ]
]//生成对应的 Observable 序列并订阅
Observable.from(times)
.flatMap { item in
return Observable.of(Int(item["value"]!))
.delaySubscription(Double(item["time"]!),
scheduler: MainScheduler.instance)
}
.debounce(0.5, scheduler: MainScheduler.instance) //只发出与下一个间隔超过0.5秒的元素
.subscribe{ print($0) }
.disposed(by: disposeBag)
运行结果......为啥我啥也没打印出来???
文章图片
u=4240739968,2514380758&fm=27&gp=0.jpg
这个留在下回思考......
但据可靠信息,咳咳咳,打印出来的应该是
1
5
6
推荐阅读
- 2.6|2.6 Photoshop操作步骤的撤消和重做 [Ps教程]
- MongoDB,Wondows下免安装版|MongoDB,Wondows下免安装版 (简化版操作)
- 在线版的迅捷思维导图怎么操作()
- 操作系统|[译]从内部了解现代浏览器(1)
- 数据库总结语句
- JS常见数组操作补充
- 7、前端--jQuery简介、基本选择器、基本筛选器、属性选择器、表单选择器、筛选器方法、节点操作、绑定事件
- 炒股知识(超级短线操作的秘籍|炒股知识:超级短线操作的秘籍 玩转股市)
- 算法回顾(SVD在协同过滤推荐系统中的应用)
- 1.2序列通用操作