1、map
(1)Definition
英文原意:
Applies a transforming closure to elements emitted by an Observable sequence,
and returns a new Observable sequence of the transformed elements.
1> 有一个 Observable sequence 发出 elements
2> map 函数提供一个 '转换闭包',对上述 elements 进行转换
3> 返回一个新的 Observable sequence,由转换后的 elements 组成
(2)Diagrams
1> 初始的 elements 是: 1、2、3
2> map 函数提供转换闭包: x => 10 * x
3> 转换后的 elements 是: 10、20、30
(3)Code
// MARK: - map
func demoForMap() {
let disposeBag = DisposeBag()
let observable = Observable.of(1, 2, 3)
observable
.map({ $0 * $0 })
.subscribe(onNext: { print($0) })
.addDisposableTo(disposeBag)
}
(4)Result
2、flatMap
(1)Definition
(2)Diagrams
1> source observable 是 Observable<Int> 类型
2> flatMap 获取到 source obserable 的第一个 element,取出 value,对其做 '乘10' 操作
3> 将转换后的 element,重新投影到一个 observable 中(即 flatMap下面的第一条线)
4> target observable 将 element 发送给 subcriber(订阅者)
5> 之后,第一个 element 的值变为4,转换后变成40,再由 target observable 发送给 subcriber
6> 第二个、第三个 element 与之类似,不再详述。
(3)Code
// MARK: - flatMap
func demoForFlatMap() {
struct Student {
var score: Variable<Int>
}
let disposeBag = DisposeBag()
// 1 创建两个 Student 的实例: jack 和 rose
let jack = Student(score: Variable(80))
let rose = Student(score: Variable(90))
// 2 创建一个 Student 类型的 Variable,初始值为 jack
let student = Variable(jack)
// 3 通过 flatMap 访问到 score
student.asObservable()
.flatMap {
$0.score.asObservable()
}
// 4 打印 onNext 事件的 element
.subscribe(onNext: {
print($0)
})
.addDisposableTo(disposeBag)
jack.score.value = 85
student.value = rose
jack.score.value = 95
rose.score.value = 100
}
(4)Result
3、flatMapLatest
(1)Definition
(2)Diagram
1> 01 被 flatMapLatest 接收,将其值转换为10,并将其投影到01的新 observable 中
2> 02 被 flatMapLatest 接收时,20对应的 observable 成为 latest observable,这个时候,即使 01 变成了 30,也不会被发送给 subcriber,因为此时它不在 latest observable 中
3> 03 的情况,以此类推
(3)Code
// MARK: - flatMapLatest
func demoForFlatMapLatest() {
struct Student {
var score: Variable<Int>
}
let disposeBag = DisposeBag()
// 1 创建两个 Student 的实例: jack 和 rose
let jack = Student(score: Variable(80))
let rose = Student(score: Variable(90))
// 2 创建一个 Student 类型的 Variable,初始值为 jack
let student = Variable(jack)
// 3 通过 flatMapLatest 访问到 score
student.asObservable()
.flatMapLatest {
$0.score.asObservable()
}
// 4 打印 onNext 事件的 element
.subscribe(onNext: {
print($0)
})
.addDisposableTo(disposeBag)
jack.score.value = 85
student.value = rose
jack.score.value = 95
rose.score.value = 100
}
(4)Result
4、scan
(1)Definition
(2)Diagram
(3)Code
// MARK: - scan
func demoForScan() {
let disposeBag = DisposeBag()
let observable = Observable.of(10, 100, 1000)
observable
.scan(2, accumulator: { aggregateValue, newValue in
aggregateValue + newValue
})
.subscribe(onNext: { print($0) })
.addDisposableTo(disposeBag)
}