Moyaとは
Alamofireのラッパーで、swiftでAPI通信を簡単にできるようになるライブラリ
参考
MoyaのProviderは変数に格納しないとエラーを吐く
以下のようなコードを書くとレスポンスが返ってこない。
MoyaProvider<SampleEnum>()
.rx
.request(.sample)
.debug()
.subscribe {
print($0)
}
コンソール
2019-01-21 18:07:04.880: Sample.swift:99 (spec()) -> subscribed
解決方法
let provider = MoyaProvider<SampleEnum>()
provider
.rx
.request(.sample)
.debug()
.subscribe {
print($0)
}
よく見ると公式に書いてある
Provider.mdに以下のように書いてある。
Always remember to retain your providers, as they will get deallocated if you fail to do so. Deallocation will return a -999 "canceled" error on response.
-999が返ってくると書いてあるようだが、rxを挟んだ場合はレスポンスが返ってこなくなってしまうようだ。
なぜこんなことが起きる?
普段Javaなどを書いていると、この二つの書き方に違いがあるとは思えない。少し調べると、以下の説が(私の中では)有力。
swiftはガベージコレクション(GC)ではなく、ARC(Automatic Reference Counting)という仕組みでメモリを管理しているらしい。
インスタンスを作って、即リクエストを飛ばすとリクエストを飛ばしている間、参照カウンタが0になり(リクエストの返りはcallback or rxなため)破棄される。
プロパティとして持っておけば、classのインスタンスが誰かに参照されている限りProviderは破棄されない。
GC脳でコーディングしていてハマったのでメモ