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