RxSwift中最重要的一类操作符,叫做Transform operators它们用来把一个Observable中的事件,变成另外一种形式。可以说,任何一个基于RxSwift开发的项目,都会使用这一类操作符。作为这个话题的第一部分,我们来看一些直观易懂的Transform operators。
七种转换操作符
delay
delayWithSelector
delayWithSelector.pngmap
通过使用一个闭包函数将原来的Observable序列转换为一个新的Observable序列
let disposeBag = DisposeBag()
Observable.of(1,2,3)
.map({
return $0 * $0
}).subscribe({print($0)})
.disposed(by: disposeBag)
执行结果
next(1)
next(4)
next(9)
completed
flatmap
现实中很多事件都是异步发生的,而并不是像Observable.of创建的看起来像集合这样的。因此,当我们需要对异步发生的事件序列进行变换的时候,就需要订阅原来的事件序列,对异步发生的事件有所察觉。其中,网络编程就是一个最典型的例子。为了在请求一个网络资源后,根据服务器返回的结果对原事件序列进行变换,flatMap就是最好的选择
let disposeBag = DisposeBag()
struct Student {
var score:Variable<Int>
}
let student1 = Student(score: Variable(60))
let student2 = Student(score: Variable(70))
let observables = Variable(student1)
observables.asObservable()
.flatMap({
$0.score.asObservable()
})
.subscribe(onNext: {
print($0)
})
.disposed(by: disposeBag)
student1.score.value = 75
observables.value = student2
student1.score.value = 85
student2.score.value = 20
执行结果
60
75
70
85
20
scan
scan就是提供一个初始化值,然后使用计算闭包不断将前一个元素和后一个元素进行处理,并将处理结果作为单个元素的Observable序列返回
let disposeBag = DisposeBag()
Observable.of(10, 100, 1000)
.scan(2) { aggregateValue, newValue in
aggregateValue + newValue
}
.subscribe(onNext: { print($0) })
.disposed(by: disposeBag)
执行结果:
12
112
1112
toArray
let bag = DisposeBag()
Observable.of(1, 2, 3)
.toArray()
.subscribe(onNext: {
// Array<Int>
print(type(of: $0))
// [1, 2, 3]
print($0)
}).addDisposableTo(bag)
网友评论