RxSwiftを使って、Promiseみたいに、いくつかの非同期処理を通して、
結果を取得する記述方法を紹介したいと思います。
まず、ストリームに対して、様々な処理を加えた結果を取得したい場合
以下のように書くことが出来ます。
let number = Variable(1)
number.map
{ number in
return number + 1
}
.map { number in
return number * 2
}
.subscribeNext { number in
// number = 4
}
次に、このmapの中で非同期処理を行いたい場合は、
以下のように、Observableを生成することで実現可能です。
let number = Variable(1)
number.map
{ number in
create { (observer: AnyObserver<Int>) in
非同期処理() {
observer.onNext(number + 1)
observer.onCompleted() // 呼ばないとストリームが詰まります
}
return NopDisposable.instance
}
}
.concat() or .merge() or .switchLatest() // 上記の非同期処理をどのように処理するか決定
.map { number in
create { (observer: AnyObserver<Int>) in
非同期処理() {
observer.onNext(number + 1)
observer.onCompleted() // 呼ばないとストリームが詰まります。
}
return NopDisposable.instance
}
}
.concat() or .merge() or .switchLatest() // 上記の非同期処理をどのように処理するか決定
.subscribeNext { number in
// number == 3
}
.addDisposableTo(self.disposeBag)
以下の3つのメソッドはObservableConvertibleType
で定義されているものです。
.concat()
.merge()
.switchLatest()
switchLatest()
は
非同期処理が実行中に次のイベントが来た場合、既存の非同期処理を止めて、あたらしいイベントを元に非同期処理が始まります。
concat,mergeは止まることなくすべての非同期処理を実行しますが、concat,mergeのお互いの違いがわかりませんでした。
errorが発生した時の挙動が異なるようです。
また、これらを挟まずにmapを連結すると、 Observable<Observable<Int>>
と、Observableがネストされてしまいます。