iOS-Rx

RxSwift三:FilteringOperators

2018-04-24  本文已影响18人  狂奔的胖蜗牛

RxSwift练习:https://github.com/flywo/RxSwiftPractice

忽视发出的事件

ignoreElements

该方法会忽略掉所有的.next事件

let strikes = PublishSubject<String>()
let disposeBag = DisposeBag()
strikes
//忽视所有next
.ignoreElements()
.subscribe { event in
print("别的事件都被忽视了:\(event)")
}
.disposed(by: disposeBag)
//忽视操作用于:当你只需要知道结果时
strikes.onNext("1")
strikes.onNext("2")
//但是completed和error还是能收到的
strikes.onCompleted()

打印如下:

别的事件都被忽视了:completed

elementAt

忽视指定次数的事件

let strikes = PublishSubject<String>()
let disposeBag = DisposeBag()
strikes
//指定需要忽视几次事件
.elementAt(2)
.subscribe { event in
print("别的时间都被忽视了:\(event)")
}
.disposed(by: disposeBag)
strikes.onNext("1")
strikes.onNext("2")
strikes.onNext("3")

打印如下:

别的时间都被忽视了:next(3)
别的时间都被忽视了:completed

忽视被观察者

filter

该方法需要传入条件,如果条件未false则该被观察者会被跳过,为true则会发出事件

let disposeBag = DisposeBag()
Observable
.of(1, 2, 3, 4, 5)
.filter { integer in
//false跳过 true发出
integer % 2 == 0
}
.subscribe { event in
print("别的被观察者都被忽视了:\(event)")
}
.disposed(by: disposeBag)
别的被观察者都被忽视了:next(2)
别的被观察者都被忽视了:next(4)
别的被观察者都被忽视了:completed

skip

跳过指定个数的被观察者

let disposeBag = DisposeBag()
Observable
.of("a", "b", "c", "d", "e", "f")
.skip(3)
.subscribe { event in
print("别的被观察者都被忽略了:\(event)")
}
.disposed(by: disposeBag)
别的被观察者都被忽略了:next(d)
别的被观察者都被忽略了:next(e)
别的被观察者都被忽略了:next(f)
别的被观察者都被忽略了:completed

skipWhile

跳过,直到条件不满足时

let disposeBag = DisposeBag()
Observable.of(2, 2, 3, 4, 4)
.skipWhile { integer in
//true跳过 false发出
integer % 2 == 0
}
.subscribe(onNext: {
print($0)
})
.disposed(by: disposeBag)
3
4
4

skipUntil

跳过队列发出的事件,直到方法给定的队列发出事件

let disposeBag = DisposeBag()
let subject = PublishSubject<String>()
let trigger = PublishSubject<String>()
//subject依赖于trigger,一旦trigger发出事件,则subject会发出事件
subject
.skipUntil(trigger)
.subscribe(onNext: {
print($0)
})
.disposed(by: disposeBag)
subject.onNext("a")
subject.onNext("b")
trigger.onNext("x")
subject.onNext("c")
subject.onNext("d")
c
d

获得事件

take

获得指定个数的被观察者发出的事件

let disposeBag = DisposeBag()
Observable
.of(1,2,3,4,5)
.take(3)
.subscribe(onNext: {
print($0)
})
.disposed(by: disposeBag)
1
2
3

takeWhile

一直获得,直到条件不满足时

let disposeBag = DisposeBag()
Observable
.of(2,2,4,4,6,6)
//通过enumerated获得index,integer
.enumerated()
.takeWhile { index, integer in
integer%2==0 && index<3
}
.map {$0.element}
.subscribe(onNext: {print($0)})
.disposed(by: disposeBag)
2
2
4

takeUntil

一直获得,直到给定外部队列发出事件

let disposeBag = DisposeBag()
let subject = PublishSubject<String>()
let trigger = PublishSubject<String>()
subject
.takeUntil(trigger)
.subscribe(onNext: {
print($0)
})
.disposed(by: disposeBag)
subject.onNext("1")
subject.onNext("2")
trigger.onNext("3")
subject.onNext("4")
1
2

变化

distinctUntilChanged

去除连续相同的被观察者

let disposeBag = DisposeBag()
Observable
.of("a","a","v","v","a")
.distinctUntilChanged()
.subscribe(onNext: {print($0)})
.disposed(by: disposeBag)
a
v
a

distinctUntilChanged自定义比较方式

自定义规则去除相同被观察者

let disposeBag = DisposeBag()
//将数字拆分开
let formatter = NumberFormatter()
formatter.numberStyle = .spellOut
Observable<NSNumber>
.of(10, 110, 20, 200, 210, 310)
.distinctUntilChanged({ a, b in
guard let aWords = formatter.string(from: a)?.components(separatedBy: " "),
let bWords = formatter.string(from: b)?.components(separatedBy: " ") else {return false}
var containMatch = false
for aWord in aWords {
for bWord in bWords {
if aWord == bWord {
containMatch = true
break
}
}
}
return containMatch
})
.subscribe(onNext: {
print($0)
})
.disposed(by: disposeBag)
10
20
200
上一篇下一篇

猜你喜欢

热点阅读