首页 > 解决方案 > 更新 Moya/RxSwift 中断了我的网络调用

问题描述

将我的 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。现在返回 aSingle而不是Observableso 为了避免我还需要插入的编译器错误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我只是错过了有用的功能/更清洁的代码)

标签: iosswiftrx-swiftmoya

解决方案


似乎问题在于保留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(…)
           }
   }
}

从提供者文档中

永远记住保留您的提供者,因为如果您不这样做,他们将被取消分配。

我想他们在某个时候更新了这些提供者是如何被解除分配的?


推荐阅读