rxswift x apikit

19
RxSwift x APIKit

Upload: kosuke-usami

Post on 22-Jan-2018

2.602 views

Category:

Software


0 download

TRANSCRIPT

Page 1: RxSwift x APIKit

RxSwift x APIKit

Page 2: RxSwift x APIKit

About me4 宇佐見 公輔 (@usamik26)

4 フェンリル株式会社4 iOS アプリエンジニア

Page 3: RxSwift x APIKit

今回の内容4 最近 RxSwift 推し4 APIKit も使ってる4 組み合わせて使うといいよ

Page 4: RxSwift x APIKit

関連 : 以前の関モバで発表した内容

Page 5: RxSwift x APIKit

関連 : Realm meetup で発表した内容

Page 6: RxSwift x APIKit

RxSwift とは

Page 7: RxSwift x APIKit

RxSwift とは4 Reactive Programming のためのライブラリ4 ReacticeX ファミリー4 Rx.NET / RxJS / RxJava / ...

Page 8: RxSwift x APIKit

例:イベント処理button.rx_tap .subscribeNext { _ in // ボタンがタップされたときの処理 } .addDisposableTo(disposeBag)

Page 9: RxSwift x APIKit

例:非同期処理URLSession.rx_response(request) .subscribeOn(sessionScheduler) .map { (data, response) in // バックグラウンド処理 } .observeOn(mainScheduler) .map { data in // UI処理 }

Page 10: RxSwift x APIKit

APIKit とは

Page 11: RxSwift x APIKit

APIKit とは4 Web API 通信のためのライブラリ4 Swift を生かして簡潔に実装できる

Page 12: RxSwift x APIKit

API クライアント実装側のコードprotocol HogeAPIRequest: Request {}extension HogeAPIRequest { var baseURL: NSURL { return NSURL(...) }}struct HogeAPI { struct HogeRequest: HogeAPIRequest { typealias Response = HogeResponse } struct HogeResponse { ... }}

Page 13: RxSwift x APIKit

API クライアント利用側のコードlet request = HogeAPI.HogeRequest(...)API.sendRequest(request) { result in switch result { case .Failure(let error): // 失敗時の処理 case .Success(let response): // 成功時の処理 }}

Page 14: RxSwift x APIKit

RxSwift x APIKit

Page 15: RxSwift x APIKit

APIKit を Rx に対応させたい4 NSURLSession の rx_response のノリで

Page 16: RxSwift x APIKit

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 { /* キャンセル処理 */ }

}}

Page 17: RxSwift x APIKit

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) } }}

Page 18: RxSwift x APIKit

使い方let request = HogeAPI.HogeRequest(...)HogeAPI.responseFrom(request) .subscribeOn(sessionScheduler) .map { (data, response) in // バックグラウンド処理 } .observeOn(mainScheduler) .map { data in // UI処理 }

Page 19: RxSwift x APIKit

ふりかえり4 簡単に実装できた4 便利4 あれ、Result 型の意味は?4 Rx の実装の中でしか使われなくなったけど・・・4 エラーハンドリングは RxSwift でやればいい