RxSwift で UIKit を扱う基本

  • 99
    いいね
  • 0
    コメント
この記事は最終更新日から1年以上が経過しています。

RxSwift では、iOS や OS X の UI と連携する機能も用意されています。

どういったものがあるかは、API の RxCocoa extensions に記載があります。

以下、iOS で使う場合について記載します(OS X もほぼ同じ)。

基本パターン

let disposeBag = DisposeBag()

override func viewDidLoad() {
    super.viewDidLoad()

    hogeButton.rx_tap
        .subscribeNext { [unowned self] _ in
            self.hoge()
        }
        .addDisposableTo(disposeBag)
}

基本的に、UIViewControllerviewDidLoad で UI アクションに対する subscribe を行うのが良いかと思います。

例えば UIButton には rx_tap が用意されています。これは、ボタンがタップされたことを通知してくれる Observable です。これを subscribe してタップ時の処理を記述します。

なお、RxSwift では DisposeBag というものが用意されています。.addDisposableTo(disposeBag) としておくことで、unsubscribe を自動的に行ってくれる仕組みになっています。

NSNotification

Cocoa の通知の仕組みのひとつ NSNotification は、add した処理の remove が面倒で忘れがちです。

NSNotificationCenter.defaultCenter().rx_notification(UIApplicationDidBecomeActiveNotification)
    .subscribeNext { [unowned self] _ in
        self.hoge()
    }
    .addDisposableTo(disposeBag)

RxSwift ではとてもシンプルに書けて幸せですね。

NSURLSession

通信処理の Observable も用意されています。

let session: NSURLSession = ...
let request = NSURLRequest(...)

session.rx_response(request)
    .catchError {
        ...
    }
    .subscribeNext { (data, response) in
        ...
    }
    .dispose()

とはいえ、通信部分は外部ライブラリを使うことが多いように思います。

僕はよく APIKit を使います。APIKit を RxSwift で扱えるように Observable を実装して使っています。これについては、以前 関西モバイルアプリ研究会 で発表しました(参考 : RxSwift x APIKit )。

以下のように使えます。

let request = ...
AppAPI.responseFrom(request)
    .catchError {
        ...
    }
    .subscribeNext {
        ...
    }
    .dispose()

API の実装コードは以下のような感じです。

static func responseFrom<T: AppAPIRequest>(request: T) -> Observable<T.Response> {
    return create { (observer: AnyObserver<T.Response>) -> Disposable in
        let dataTask = Session.sendRequest(request) { result in
            switch result {
            case .Success(let response):
                observer.onNext(response)
                observer.onCompleted()
            case .Failure(let error):
                observer.onError(error)
            }
        }
        return AnonymousDisposable {
            dataTask?.cancel()
        }
    }
}

まとめ

RxSwift のうち、RxCocoa 部分の基本的な使い方を整理して簡潔に書きました。