本文罗列一些RX常用的高阶函数,走起
1.组合操作符
1.1 starWith
- 再开始从可观察序列发出元素之前,发出指定的元素序列
Observable.of("1","2","3")
.startWith("A")
.startWith("B")
.startWith("D","E")
.subscribe(onNext:{print($0)})
.disposed(by: disposeBag)
//输出:DEBA123
1.2 merge
- 将原可观察序列中的元素组合成一个新的可观察序列,并像每个源可观察序列发出元素一样发出每个元素
let subject1 = PublishSubject()
let subject2 = PublishSubject()
Observable.of(subject1,subject2)
.merge()
.subscribe(onNext:{print($0)})
.disposed(by: disposeBag)
subject1.onNext("H")
subject1.onNext("e")
subject1.onNext("l")
subject1.onNext("l")
subject2.onNext("o")
1.3 zip
- 将多达8个源可观测序列组合成一个新的可观测序列,并将从组合的可观测序列中发射出对应索引处每个源可观测序列的元素
- 只有两个序列同时有值的时候才会响应,否则存值
let stringSubject = PublishSubject()
let intSubject = PublishSubject()
let otherSubject = PublishSubject()
Observable.zip(stringSubject,intSubject,otherSubject){stringElement,intElement,otherElement in
"\(stringElement)\(intElement)\(otherElement)"
}.subscribe(onNext:{print($0)})
.disposed(by: disposeBag)
stringSubject.onNext("one")
stringSubject.onNext("two")
intSubject.onNext(1)
intSubject.onNext(2)
stringSubject.onNext("K")
otherSubject.onNext("G")
}
//输出:one1G
** 1.4 combineLatest**
- 将开始发出联合观测序列的每个源的最新元素可观测序列一旦所有排放源序列至少有一个元素,并且当源可观测序列发出的任何一个新元素
- 应用非常频繁: 比如账户和密码同时满足->才能登陆. 不关系账户密码怎么变化的只要查看最后有值就可以 loginEnable
let stringSub = PublishSubject()
let intSub = PublishSubject()
Observable.combineLatest(stringSub,intSub){stringElement,intElement in
"\(stringElement)\(intElement)"
}.subscribe(onNext:{print($0)})
.disposed(by: disposeBag)
stringSub.onNext("A")
stringSub.onNext("B") //覆盖掉一个存一个
intSub.onNext(1) //输出B1
intSub.onNext(2) //覆盖掉一个存一个.输出B2
** 2.映射操作符**
2.1 map
- 转换闭包应用于可观察序列发出的元素,并返回转换后的元素的新可观察序列。
let ob = Observable.of(1,2,3,4)
ob.map { (number) -> Int in
return number+2
}
.subscribe{
print("\($0)")
}
.disposed(by: disposeBag)
3.过滤操作符
3.1 filter
Observable.of(1,2,3,4,5,6,7,8,9,0)
.filter { $0 % 2 == 0 }
.subscribe(onNext: { print($0) })
.disposed(by: disposeBag)
3.2 distinUntikChanged
Observable.of("1", "2", "2", "2", "3", "3", "4")
.distinctUntilChanged()
.subscribe(onNext: { print($0) })
.disposed(by: disposeBag)
3.3 skip
- 从源可观察序列发出元素,直到参考可观察序列发出元素
- 这个要重点,应用非常频繁 不用解释 textfiled 都会有默认序列产生
Observable.of(1, 2, 3, 4, 5, 6)
.skip(2)
.subscribe(onNext: { print($0) })
.disposed(by: disposeBag)
print("*****skipWhile*****")
Observable.of(1, 2, 3, 4, 5, 6)
.skipWhile { $0 < 4 }
.subscribe(onNext: { print($0) })
.disposed(by: disposeBag)