RxMoya (RxSwift + Moya)
Swift Moyaでモヤっとしているネットワークレイヤーを解決 - タコさんブログ のRx編。
RxMoyaProviderでは、MoyaProviderにコールバッククロージャを与える代わりに、オブザーバブルなレスポンスを使用する。
今回の例もiTunes Apple APIを使用して音楽のアルバムを検索する。
環境
Moya & RxMoya をPodでインストール
use_frameworks! pod 'Moya/RxSwift' pod 'SwiftyJSON' # JSONに変換するのに使用
RxMoya 準備
API ターゲットを設定、ターゲットをTargetTypeプロトコルに準拠させる 方法は 前記事のMoya とほぼ同じ。違いは import Moya としている箇所を
import RxMoya
RxMoyaに変更し、enumの値に対応したHTTPメソッドを指定 している箇所のMoya.Methodを
internal var method: RxMoya.Method { // 略 }
RxMoyaに変更する。
リクエスト方法
MoyaProviderのリクエストをサブスクライブするとリクストが開始される。
注意として、リクエストが完了する前にオブザーバブルを破棄するとキャンセルされる。キャンセルされないようにMoyaProviderをローカルに保持する必要がある。
// providerを生成 let provider = RxMoyaProvider<iTunes>() let disposeBag = DisposeBag()
実際のリクエスト。
func requestWithRxMoya() { // 検索ターム"swift"を指定して、Search APIをリクエストする // responseの型は Observable<Response> let response = provider.request(.Search("swift")) let disposable = response .map { (response: Response) -> JSON in // SwiftyJSONを使用して、response.date (NSData型) を // JSONに変換 return JSON(data: response.data) } .subscribeNext { // results配列(アルバム情報)を出力 if let results = $0["results"].array { print(results) } else { print("Error") } } // メモリ管理 disposeBag.addDisposable(disposable) }
以下のようなアルバム情報の配列が出力される。
[{ "trackCount" : 14, "collectionId" : 907242701, "collectionName" : "1989", "artistName" : "Taylor Swift", ... },{ ... }, ...