タコさんブログ

プログラミングメモと小言

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",
  ...
  },{
    ...
  }, ...

参考URL