TwitterAPIKit の RxSwift 対応
TwitterAPIKit という Swift から Twitter API を叩くためのライブラリを作っています。
TwitterAPIKit はレスポンスの受け取り方は callback(closure)形式か Concurrency(async await)形式の両方を提供しています。
client.v1.tweet.getShowStatus(.init(id: "status id"))
.responseDecodable(type: Entity.self) { response in }
// or
let response = await client.v1.tweet.getShowStatus(.init(id: "status id"))
.responseDecodable(type: Entity.self)
一方で RxSwift を使っているプロジェクトの場合は RxSwift に適した形式(Single<SomeResponse>
的な)でレスポンスを受け取りたいとう要望も多いと思います。
こんなイメージ
client.v1.tweet.rx.getShowStatus(.init(id: "status id"))
.subscribe()
.disposed(by: disposeBag)
そんな要望に応えるために以下の RxSwift 用の extension を用意しました。
以下の gist にある 1_TwitterAPIKit+RxSwift.generated.swift
を自分のプロジェクト内にコピペしてもらうと使用できます。
以下細かいことを解説したいと思います。
諸注意
- 全てのメソッドが対応しているわけではありません。 ユーティリティ系メソッドなどはコード生成で書くのが大変だったので非対応です
- そんなに難しくないと思うので必要な人は自前で書いてみてください(難しかったら書いてあげます)
- クソでかいのでコピペすると Xcode がしばらくフリーズしますがそのまま待ってください
- 使い方
なぜコピペして使う形式?
ライブラリ(TwitterAPIKit)本体は他のライブラリへの依存を持たない方針のためです。
必要な人だけが使っていただければと思います。
全部書いたの? 頭おかしいの?
Rx 拡張は 2500行近くありますが手で書いたわけではありません。 Sourcery を使ってコード生成しています。
コード生成に使用した stencil ファイルは同じ gist のページにあります↓。
Any とか Data でレスポンスを受け取りたいんだけど?
コード生成に使用した stencil のテンプレートをいじると変更できると思います。
いろいろ
TwitterAPIKit は各 API の property は protocol で公開していましたが、それだと RxSwift の拡張 (extension Reactive where Base: Hoge
的なやつ) が書けないため全て class に書き直しました。
以下の PR でその修正を行っています。
Discussion