LoginSignup
3
2

More than 5 years have passed since last update.

MoyaProviderを呼び出す時は一度変数に格納しなければならない

Posted at

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脳でコーディングしていてハマったのでメモ

3
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
2