Обновление Moya / RxSwift прерывает мои сетевые вызовы - PullRequest
0 голосов
/ 27 июня 2018

Обновление моего iOS-приложения с Moya 8 до 11, и у меня есть следующая функция в классе сетевых утилит, которая вызывается для получения данных с сервера и сопоставления их для использования в других классах:

func getServerData(endpoint: MyMoyaService) -> Observable<Any> {
    let provider = RxMoyaProvider<MyMoyaService>()
    return provider.request(endpoint)
        .filterSuccessfulStatusAndRedirectCodes()
        .mapJSON()
        .flatMap { response -> Observable<Any> in
            return Observable(…)
        }
}

С обновлениями RxMoyaProvider был заменен на MoyaProvider, и вместо этого вы должны использовать .rx для использования расширений RxSwift. Теперь это возвращает Single вместо Observable, поэтому, чтобы избежать ошибок компилятора, мне также нужно было вставить asObservable()

func getServerData(endpoint: MyMoyaService) -> Observable<Any> {
    let provider = MoyaProvider<MyMoyaService>()
    return provider.rx.request(endpoint)
        .asObservable()
        .filterSuccessfulStatusAndRedirectCodes()
        .mapJSON()
        .flatMap { response -> Observable<Any> in
            return Observable(…)
        }
}

Но часть flatMap вообще не вызывается, и мои сетевые вызовы больше не работают. Если я сделаю это без RxSwift, просто включив результат, он будет работать нормально (но это не соответствует моей текущей настройке), поэтому я знаю, что сетевой вызов и обновления для пользовательской службы TargetType выполнены правильно.

  1. Как мне заставить это работать снова (в идеале, без полного изменения всей настройки, и
  2. (за дополнительную плату), как воспользоваться всеми преимуществами обновленной установки с Single вместо Observable (поскольку я предполагаю, что при использовании asObservable я просто упускаю полезные функции / более чистый код)

1 Ответ

0 голосов
/ 27 июня 2018

Кажется, проблема в том, что объект MoyaProvider сохраняется ... Если я перемещу провайдера за пределы функции и сохраню его как свойство в классе, то все будет работать правильно.

class MyClass {
     let provider = MoyaProvider<MyMoyaService>()
     func getServerData(endpoint: MyMoyaService) -> Observable<Any> {
        return provider.rx.request(endpoint)
           .asObservable()
           .filterSuccessfulStatusAndRedirectCodes()
           .mapJSON()
           .flatMap { response -> Observable<Any> in
               return Observable(…)
           }
   }
}

Из документации поставщика :

Всегда не забывайте оставлять своих провайдеров, поскольку они будут освобождены, если вы этого не сделаете.

Полагаю, в какой-то момент они обновили информацию об освобождении этих провайдеров?

...