SwiftyXMLParser + Moya + RxSwift 使ってみた
iOSアプリを開発中にXMLを返すAPIを使うことになったので、XML形式のものをどうマッピングするかを忘れないように記事にしました。
なんでSwiftyXMLParserを使うの?
ではなぜXMLParserを使わないかというと、
- 使い勝手が悪い
- Rxと組み合わせて使うとなると色々大変
だからです。
サードパーティのXMLParser Libraryは何個かありますが、今回は
- Moya (Alamoifre) と一緒に使う
- Rxをゴリゴリ使っているプロジェクト
という状況だったのと、Star数を鑑みてSwiftyXMLParserを選択しました。
SwiftyXMLParserの使い方
導入の仕方、それぞれの要素へのアクセスの仕方については、READMEを参考にしてください。
ここでは、READMEに書いていない実際に使うときにはどうするかを書いていきます。
Modelへのマッピング
例としてradikoの番組を取得するAPIを使ってみます。(最近ではXML形式のレスポンスを返すAPI少なくて、探すの大変でした....)
<station id="QRR"> <name>文化放送</name> <progs> <date>20181119</date> <prog id="9463445504" master_id="" ft="20181119010000" to="20181119013000" ftl="2500" tol="2530" dur="1800"> <title>加隈亜衣のアズールレーディオ</title> <url>http://www.joqr.co.jp/azur/</url> <pfm>加隈亜衣</pfm> <img> https://radiko.jp/res/program/DEFAULT_IMAGE/QRR/cl_20180328180436_859305.jpg </img> <metas> <meta name="twitter" value="#アズラジ"/> <meta name="twitter" value="from:azuradio_joqr"/> </metas> </prog> <prog id="9463445505" master_id="" ft="20181119013000" to="20181119020000" ftl="2530" tol="2600" dur="1800"> <title>スクエニ第10BD開発局</title> <url/> <pfm>日高里菜 大久保瑠美</pfm> <img> https://radiko.jp/res/program/DEFAULT_IMAGE/QRR/20160927220522.png </img> <metas> <meta name="twitter" value="#joqr"/> <meta name="twitter" value="from:joqrpr"/> </metas> </prog> </progs> </station>
XMLParsableプロトコルを作成する
SwiftyXMLParserのオブジェクトであるXML.Accessor
からイニシャライズ可能を示す、XMLParsableを作成します。
XMLParsableを実装する
各ModelにXMLParsable#init(accessor: XML.Accessor)
を実装します。
ネストしたオブジェクト・配列・attributeへのアクセスなど、引っかかりそうなものは拾い上げたので、
マッピングで苦戦している方は比較して真似してみてください。
Moya + RxSwift
Moyaのセットアップ
Moyaのセットアップについては、こちらを参考にしてください。
Serviceの作成
RxSwiftのSingle
を返す関数を用意します。map()
を使うことで、綺麗に書くことができます。
完成!