【RxSwift】毎回DisposeBagを作るのから解放されたい

Monday, May 16, 2016

前からプロジェクトに便利そうだなーって思ってとりあえずCarthageで入れたものの、存在を忘れてて整理してたらこれ便利じゃんってなったので忘れぬうちに記事にします。

毎回DisposeBagを作る…のだるい!

RxSwiftで書いているとほぼ毎回でてくるこのDisposeBag。だいたい、

import UIKit
import RxSwift

class HogeViewController: UIViewController {
    let disposeBag = DisposeBag() // ←毎回定義して...
    @IBOutlet private weak var button: UIButton!
    override func viewDidLoad() {
        super.viewDidLoad()
        button.rx_tap
          .subscribeNext { _ in
              print("tap!")
          }
          .addDisposableTo(disposeBag) // ←突っ込む
    }
}

こんな感じでsubscribeした後なんかは必要になります。これが1箇所だろうが、10箇所だろうがDisposeBagを作って登録する必要がでてきます。
これが非常に面倒なんですよね。。

そこで登場するのが、 NSObject-Rx です。

どういうものなのか

NSObjectにextensionでDisposeBagを持たせて、そのオブジェクトが解放されるときに合わせて自動的にDisposeBagを解放させる、といったものです。
これにより、毎回ViewController毎にDisposeBagを作る必要がなくなり、

import UIKit
import RxSwift
import NSObject_Rx

class HogeViewController: UIViewController {
    @IBOutlet private weak var button: UIButton!

    override func viewDidLoad() {
        super.viewDidLoad()
        button.rx_tap
          .subscribeNext { _ in
              print("tap!")
          }
          .addDisposableTo(rx_disposeBag)
    }
}

と、 rx_disposeBag を指定してあげるだけでよくなります。
NSObjectを継承したクラスに対してのみ有効になりますが、少しはDisposeBagを宣言して、というのから解放されそうです。
今日は出来る限りこちらに換装できるものは換装させちゃいました。スッキリ。

techSwiftRxSwift

【iOS10】通知に画像や動画(アタッチメント)を付与する

【Swift】3.0でどうやら`Self`が拡張されるみたい