RxSwift x APIKit
About me
4 宇佐見 公輔 (@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 でやればいい

RxSwift x APIKit