LoginSignup
26
25

More than 5 years have passed since last update.

RxSwiftでPromiseのような記述方法

Last updated at Posted at 2015-11-19

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がネストされてしまいます。

http://muukii.me/2015/11/10/rxswift-promiss/

26
25
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
26
25