RxSwift 转换操作符

2017-07-25  本文已影响0人  AKyS佐毅

RxSwift中最重要的一类操作符,叫做Transform operators它们用来把一个Observable中的事件,变成另外一种形式。可以说,任何一个基于RxSwift开发的项目,都会使用这一类操作符。作为这个话题的第一部分,我们来看一些直观易懂的Transform operators。
七种转换操作符

delay

delayWithSelector

delayWithSelector.png

map

通过使用一个闭包函数将原来的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)
上一篇下一篇

猜你喜欢

热点阅读