就问此时此刻还有谁?45度仰望天空,该死!我这无处安放的魅力!swift
- RxSwift(1)— 初探
- RxSwift(2)— 核心逻辑源码分析
- RxSwift(3)— Observable序列的建立方式
- RxSwift(4)— 高阶函数(上)
- RxSwift(5)— 高阶函数(下)
- RxSwift(6)— 调度者-scheduler源码解析(上)
- RxSwift(7)— 调度者-scheduler源码解析(下)
- RxSwift(8)— KVO底层探索(上)
- RxSwift(9)— KVO底层探索(下)
- RxSwift(10)— 场景序列总结
- RxSwift(11)— dispose源码解析
- RxSwift(12)— Subject即攻也守
- RxSwift(13)— 爬过的坑
- RxSwift(14)— MVVM双向绑定
RxSwift 目录直通车 --- 和谐学习,不急不躁!数组
由于
RxSwift
,咱们游刃在函数响应式的世界里!若是你想玩得更爽,那么这一篇RxSwift-高阶函数
对你来讲是必需要掌握的内容!只有你玩好了高阶函数才能在实际开发中真正地享受:万物皆Rx网络
print("*****startWith*****")
Observable.of("1", "2", "3", "4")
.startWith("A")
.startWith("B")
.startWith("C", "a", "b")
.subscribe(onNext: { print($0) })
.disposed(by: disposeBag)
//效果: CabBA1234
复制代码
print("*****merge*****")
let subject1 = PublishSubject<String>()
let subject2 = PublishSubject<String>()
// merge subject1和subject2
Observable.of(subject1, subject2)
.merge()
.subscribe(onNext: { print($0) })
.disposed(by: disposeBag)
subject1.onNext("C")
subject1.onNext("o")
subject2.onNext("o")
subject2.onNext("o")
subject1.onNext("c")
subject2.onNext("i")
// Cooci - 任何一个响应都会勾起新序列响应
复制代码
print("*****zip*****")
let stringSubject = PublishSubject<String>()
let intSubject = PublishSubject<Int>()
Observable.zip(stringSubject, intSubject) { stringElement, intElement in
"\(stringElement) \(intElement)"
}
.subscribe(onNext: { print($0) })
.disposed(by: disposeBag)
stringSubject.onNext("C")
stringSubject.onNext("o") // 到这里存储了 C o 可是不会响应除非;另外一个响应
intSubject.onNext(1) // 勾出一个
intSubject.onNext(2) // 勾出另外一个
stringSubject.onNext("i") // 存一个
intSubject.onNext(3) // 勾出一个
// 说白了: 只有两个序列同时有值的时候才会响应,不然存值
复制代码
print("*****combineLatest*****")
let stringSub = PublishSubject<String>()
let intSub = PublishSubject<Int>()
Observable.combineLatest(stringSub, intSub) { strElement, intElement in
"\(strElement) \(intElement)"
}
.subscribe(onNext: { print($0) })
.disposed(by: disposeBag)
stringSub.onNext("L") // 存一个 L
stringSub.onNext("G") // 存了一个覆盖 - 和zip不同
intSub.onNext(1) // 发现strOB也有G 响应 G 1
intSub.onNext(2) // 覆盖1 -> 2 发现strOB 有值G 响应 G 2
stringSub.onNext("Cooci") // 覆盖G -> Cooci 发现intOB 有值2 响应 Cooci 2
// combineLatest 比较zip 会覆盖
// 应用很是频繁: 好比帐户和密码同时知足->才能登录. 不关系帐户密码怎么变化的只要查看最后有值就能够 loginEnable
复制代码
print("*****switchLatest*****")
let switchLatestSub1 = BehaviorSubject(value: "L")
let switchLatestSub2 = BehaviorSubject(value: "1")
let switchLatestSub = BehaviorSubject(value: switchLatestSub1)// 选择了 switchLatestSub1 就不会监听 switchLatestSub2
switchLatestSub.asObservable()
.switchLatest()
.subscribe(onNext: { print($0) })
.disposed(by: disposeBag)
switchLatestSub1.onNext("G")
switchLatestSub1.onNext("_")
switchLatestSub2.onNext("2")
switchLatestSub2.onNext("3") // 2-3都会不会监听,可是默认保存由 2覆盖1 3覆盖2
switchLatestSub.onNext(switchLatestSub2) // 切换到 switchLatestSub2
switchLatestSub1.onNext("*")
switchLatestSub1.onNext("Cooci") // 原理同上面 下面若是再次切换到 switchLatestSub1会打印出 Cooci
switchLatestSub2.onNext("4")
复制代码
combineLatest
底层原理来分析self._arity = arity
这就是咱们这次管理的序列个数self._hasValue
就是一个初始化的个数为arity
的,里面的值都是false
,只有为何这么初始化后面会讲的!next(_ index: Int)
方法中,判断self._hasValue[index]
就是咱们的刚刚初始化的集合,第一次进来就是第一个序列,进来就会标记true
,而且_numberOfValues+1
,此时就是0->1
_numberOfValues < arity
就会跳过true
,而且_numberOfValues+1
,此时就是1->2
self._numberOfValues == self._arity
,取回let result = try self.getResult()
响应结果,而后就发送出去:self.forwardOn(.next(result))
combineLatest
必须两个序列都响应才会响应最终的结果print("*****map*****")
let ob = Observable.of(1,2,3,4)
ob.map { (number) -> Int in
return number+2
}
.subscribe{
print("\($0)")
}
.disposed(by: disposeBag)
复制代码
flatMap
和flatMapLatest
的区别是,flatMapLatest
只会从最近的内部可观测序列发射元素print("*****flatMap*****")
let boy = LGPlayer(score: 100)
let girl = LGPlayer(score: 90)
let player = BehaviorSubject(value: boy)
player.asObservable()
.flatMap { $0.score.asObservable() } // 自己score就是序列 模型就是序列中的序列
.subscribe(onNext: { print($0) })
.disposed(by: disposeBag)
boy.score.onNext(60)
player.onNext(girl)
boy.score.onNext(50)
boy.score.onNext(40)// 若是切换到 flatMapLatest 就不会打印
girl.score.onNext(10)
girl.score.onNext(0)
复制代码
flatMapLatest
其实是map
和switchLatest
操做符的组合print("*****scan*****")
Observable.of(10, 100, 1000)
.scan(2) { aggregateValue, newValue in
aggregateValue + newValue // 10 + 2 , 100 + 10 + 2 , 1000 + 100 + 2
}
.subscribe(onNext: { print($0) })
.disposed(by: disposeBag)
// 这里主要强调序列值之间的关系
复制代码
map
来进行分析composeMap
建立中间序列:Mapself._source = source
& self._transform = transform
保存源序列和外界传进去的映射表达式:$0+2
MapSink
调用on(_ event: Event<SourceType>)
来发送信号,发送信号以前let mappedElement = try self._transform(element)
取出要发送的结果,就是通过映射表达式处理的结果self.forwardOn(.next(mappedElement))
正常发送print("*****filter*****")
Observable.of(1,2,3,4,5,6,7,8,9,0)
.filter { $0 % 2 == 0 }
.subscribe(onNext: { print($0) })
.disposed(by: disposeBag)
复制代码
print("*****distinctUntilChanged*****")
Observable.of("1", "2", "2", "2", "3", "3", "4")
.distinctUntilChanged()
.subscribe(onNext: { print($0) })
.disposed(by: disposeBag)
复制代码
print("*****elementAt*****")
Observable.of("C", "o", "o", "c", "i")
.elementAt(3)
.subscribe(onNext: { print($0) })
.disposed(by: disposeBag)
复制代码
print("*****single*****")
Observable.of("Cooci", "Kody")
.single()
.subscribe(onNext: { print($0) })
.disposed(by: disposeBag)
Observable.of("Cooci", "Kody")
.single { $0 == "Kody" }
.subscribe { print($0) }
.disposed(by: disposeBag)
复制代码
print("*****take*****")
Observable.of("Hank", "Kody","Cooci", "CC")
.take(2)
.subscribe(onNext: { print($0) })
.disposed(by: disposeBag)
复制代码
print("*****takeLast*****")
Observable.of("Hank", "Kody","Cooci", "CC")
.takeLast(3)
.subscribe(onNext: { print($0) })
.disposed(by: disposeBag)
复制代码
print("*****takeWhile*****")
Observable.of(1, 2, 3, 4, 5, 6)
.takeWhile { $0 < 3 }
.subscribe(onNext: { print($0) })
.disposed(by: disposeBag)
复制代码
print("*****takeUntil*****")
let sourceSequence = PublishSubject<String>()
let referenceSequence = PublishSubject<String>()
sourceSequence
.takeUntil(referenceSequence)
.subscribe { print($0) }
.disposed(by: disposeBag)
sourceSequence.onNext("Cooci")
sourceSequence.onNext("Kody")
sourceSequence.onNext("CC")
referenceSequence.onNext("Hank") // 条件一出来,下面就走不了
sourceSequence.onNext("Lina")
sourceSequence.onNext("小雁子")
sourceSequence.onNext("婷婷")
复制代码
textfiled
都会有默认序列产生print("*****skip*****")
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)
复制代码
print("*****skipUntil*****")
let sourceSeq = PublishSubject<String>()
let referenceSeq = PublishSubject<String>()
sourceSeq
.skipUntil(referenceSeq)
.subscribe(onNext: { print($0) })
.disposed(by: disposeBag)
// 没有条件命令 下面走不了
sourceSeq.onNext("Cooci")
sourceSeq.onNext("Kody")
sourceSeq.onNext("CC")
referenceSeq.onNext("Hank") // 条件一出来,下面就能够走了
sourceSeq.onNext("Lina")
sourceSeq.onNext("小雁子")
sourceSeq.onNext("婷婷")
复制代码
print("*****toArray*****")
Observable.range(start: 1, count: 10)
.toArray()
.subscribe { print($0) }
.disposed(by: disposeBag)
复制代码
scan
print("*****reduce*****")
Observable.of(10, 100, 1000)
.reduce(1, accumulator: +) // 1 + 10 + 100 + 1000 = 1111
.subscribe(onNext: { print($0) })
.disposed(by: disposeBag)
复制代码
print("*****concat*****")
let subject1 = BehaviorSubject(value: "Hank")
let subject2 = BehaviorSubject(value: "1")
let subjectsSubject = BehaviorSubject(value: subject1)
subjectsSubject.asObservable()
.concat()
.subscribe { print($0) }
.disposed(by: disposeBag)
subject1.onNext("Cooci")
subject1.onNext("Kody")
subjectsSubject.onNext(subject2)
subject2.onNext("打印不出来")
subject2.onNext("2")
subject1.onCompleted() // 必需要等subject1 完成了才能订阅到! 用来控制顺序 网络数据的异步
subject2.onNext("3")
复制代码
因为篇幅缘由,这篇博客先写到这里,高阶函数的用法仍是有点意思的!若是你是一个
RxSwift
新手,仍是很是建议你们耐着性子好好练习,对你的开发绝对有帮助 请继续观看下一篇博客 RxSwift-高阶函数(下)闭包就问此时此刻还有谁?45度仰望天空,该死!我这无处安放的魅力!app