Observableとsubjectに関して

Rxswiftまとめ

Rxswiftには、swiftを勉強していてもなかなか出てこないメソッドが多くあります。 そこで、自分が読んだ記事を参考にまとめることにします。

Observable

ObserVableは、イベントの監視を可能とするメソッド。observableを表している。 これらで、onError,onCompletedに関しては呼ばれた時点で監視が終了する。 ・onNext ・・・ 通常のイベント通知(値を入れることができ、何回でも呼ばれる) ・onError ・・・ エラー通知(1回だけ、呼ばれた時点で終了) ・onCompleted ・・・ 完了(1回だけ、呼ばれた時点で終了)

onError、onCompletedが呼ばれた時点で、監視が終了したことを表す。

let contentOffset = tableView.rx.contentOffset

    .subscribe(onNext: {
        print("next")
    }, onError: { _ in
        print("error")
    }, onCompleted: { 
        print("completed")
    })

contentOffsetは、scrollViewでよく用いられるメソッド。UIScrollViewのスクロール位置が初期状態(= contentOffset = {0, 0})の状態からx, y方向にどれだけスクロールしたかを表す。 今回は、scrollViewがスクロールされるたびにイベントが発生しその値を監視している。そして、UIKitをsubscribeする場合はとくにエラー処理や完了処理を行わなくても良い。 つまり、このコードではsubscribe(監視)で、変数contentOffsetを監視している。変数contentOffsetは、tableView.rx.contentOffsetなのでscrollというイベントが発生するたびにsubscribe(監視)を行いprintされることがわかる。

Dispose

Observableをsubscribeしたときに返されるのがDisposable。disposableは購読を解除するもので、disposeメソッドを呼ぶことで購読を解除する。もし、このdisposeを行わないとメモリーリークに繋がる。

private let disposeBag = DisposeBag()
let contentOffset = tableView.rx.contentOffset
 
contentOffset
    .subscribe(onNext: {
        print("next")
    }, onError: { _ in
        print("error")
    }, onCompleted: { 
        print("completed")
    })
    .Disposed(disposeBag)

上記に書いた、コードにdisposeを表すとこのように書くことができる。つまり、tableView.rx.contentOffsetのイベントの購読がonNextで行われその値の解放を一番最後に書くことでメモリリークを防いでいる。

Subject

subjectは、observableでもありobserverでもある。つまり、イベントを検知することもできイベントを発生させることもできる。observableは、独自でイベントを発生させることができない。Subjectは、subscribeを行えばobservableとしての機能を持ちつつ、onNext,onError,onCompletedメソッドを呼ぶことでイベントを発生させることができる。subjectクラスには、4つのクラスがある。 ・PublishSubject ・replaySubject ・BehaviorSubject ・Variable の4つがある。

publishSubject

publishSubjectをつかったコード

let disposeBag = DisposeBag()

let subject = PublishSubject<String>()
 //ここで、subjectはPublishSubjectのstring型であることを書いている。

subject.onNext("a") 
//ここにsubjectのonNext(“a”)を流しても、printはされない。

subject.subscribe({ event in
  print(event)
})
.addDisposableTo(disposeBag)
 
subject.onNext("a") 
subject.onNext("b") 
 ```
onNextメソッドを呼ぶことでイベントを発生させることができ、subscribeすることで購読し、イベントを検知した際の処理を定義することができる。

Observableは、基本的に外部からのイベントを通知するなどのことができる。
・replaySubject
・BehaviorSubject
・Variable
に関しては今後書いていきます。