RxSwift 过滤操作符(Filtering Observab

2018-09-26  本文已影响26人  darrenW

过滤操作指的是从源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

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

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

该方法实现仅发送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

let disposeBag = DisposeBag()

let source = PublishSubject<Int>()
let notifier = PublishSubject<String>()

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

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
上一篇下一篇

猜你喜欢

热点阅读