rxswift x apikit
TRANSCRIPT
RxSwift x APIKit
About me4 宇佐見 公輔 (@usamik26)
4 フェンリル株式会社4 iOS アプリエンジニア
今回の内容4 最近 RxSwift 推し4 APIKit も使ってる4 組み合わせて使うといいよ
関連 : 以前の関モバで発表した内容
関連 : Realm meetup で発表した内容
RxSwift とは
RxSwift とは4 Reactive Programming のためのライブラリ4 ReacticeX ファミリー4 Rx.NET / RxJS / RxJava / ...
例:イベント処理button.rx_tap .subscribeNext { _ in // ボタンがタップされたときの処理 } .addDisposableTo(disposeBag)
例:非同期処理URLSession.rx_response(request) .subscribeOn(sessionScheduler) .map { (data, response) in // バックグラウンド処理 } .observeOn(mainScheduler) .map { data in // UI処理 }
APIKit とは
APIKit とは4 Web API 通信のためのライブラリ4 Swift を生かして簡潔に実装できる
API クライアント実装側のコードprotocol HogeAPIRequest: Request {}extension HogeAPIRequest { var baseURL: NSURL { return NSURL(...) }}struct HogeAPI { struct HogeRequest: HogeAPIRequest { typealias Response = HogeResponse } struct HogeResponse { ... }}
API クライアント利用側のコードlet request = HogeAPI.HogeRequest(...)API.sendRequest(request) { result in switch result { case .Failure(let error): // 失敗時の処理 case .Success(let response): // 成功時の処理 }}
RxSwift x APIKit
APIKit を Rx に対応させたい4 NSURLSession の rx_response のノリで
NSURLSession の実装を参照するfunc rx_response(request: NSURLRequest) -> Observable<NSData!, NSURLResponse!> { return create { observer in // request を送信してレスポンスを受け取る if 失敗 {
observer.on(.Error(error)) } else { observer.on(.Next(data, response)) observer.on(.Completed) } return AnonymousDisposable { /* キャンセル処理 */ }
}}
APIKit 版func responseFrom<T: AppAPIRequest>(request: T) -> Observable<T.Response> { return create { (observer: ObserverOf<T.Response>) in API.sendRequest(request) { result in switch result { case .Failure(let error): observer.on(.Error(error)) case .Success(let response): observer.on(.Next(response)) observer.on(.Completed) } } return AnonymousDisposable { API.cancelRequest(T) } }}
使い方let request = HogeAPI.HogeRequest(...)HogeAPI.responseFrom(request) .subscribeOn(sessionScheduler) .map { (data, response) in // バックグラウンド処理 } .observeOn(mainScheduler) .map { data in // UI処理 }
ふりかえり4 簡単に実装できた4 便利4 あれ、Result 型の意味は?4 Rx の実装の中でしか使われなくなったけど・・・4 エラーハンドリングは RxSwift でやればいい