代码之家  ›  专栏  ›  技术社区  ›  shim

更新moya/rxswift中断我的网络呼叫

  •  1
  • shim  · 技术社区  · 6 年前

    将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. (对于额外的学分)如何充分利用 单身 而不是 可观察的 (因为我假设 asObservable 我只是错过了一些有用的特性/干净的代码)
    1 回复  |  直到 6 年前
        1
  •  3
  •   shim    6 年前

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

    From the providers documentation 以下内容:

    请始终记住保留您的提供商,因为如果您不这样做,他们将被解除分配。

    我想在某个时候他们更新了这些提供商是如何被释放的?