Edited at
RxSwiftDay 6

RxSwift で UIKit を扱う基本

More than 1 year has passed since last update.

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

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

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


基本パターン

let disposeBag = DisposeBag()

override func viewDidLoad() {
super.viewDidLoad()

hogeButton.rx.tap
.subscribe { [unowned self] _ in
self.hoge()
}
.disposed(by: disposeBag)
}

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

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

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


NSNotification

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

NotificationCenter.default.rx.notification(NSNotification.Name.UIApplicationDidBecomeActive)

.subscribe { [unowned self] _ in
self.hoge()
}
.disposed(by: disposeBag)

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


URLSession

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

let session: URLSession = ...

let request = URLRequest(...)

session.rx.response(request)
.catchError {
...
}
.subscribe { (data, response) in
...
}
.disposed(by: disposeBag)

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

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

以下のように使えます。

let request = ...

AppAPI.responseFrom(request)
.catchError {
...
}
.subscribe {
...
}
.disposed(by: disposeBag)

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.on(.next(response))
observer.on(.completed)
case .failure(let error):
observer.on(.error(error))
}
}
return AnonymousDisposable {
dataTask?.cancel()
}
}
}


まとめ

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