链接RxSwift和Alamofire的异步请求中的调用函数

问题描述 投票:0回答:1

[我是RxSwift的初学者,这是我的问题,我的应用必须执行3个请求,其中3个是gets,我的工作团队建议我使用flatmap连续执行这3个请求,但是我不知道该如何使用Flatmap。

这些是我的要求

public func login(param: [String:String]) -> Observable<messageModel>{
        return Observable.create { observer -> Disposable in
            self.alamoFireManager!.request(self.urlServer!+endPoints.login.login, method: .post, parameters: param, encoding: URLEncoding.default, headers: nil, interceptor: nil).responseDecodable { (res: DataResponse<messageModel,AFError>) in
                if let error = res.error {
                    observer.onError(error)
                } else if let valueEntitie = res.value {
                    observer.onNext(valueEntitie)
                }
                observer.onCompleted()
            }
            return Disposables.create()
        }
    }


public func me()  -> Observable<meModel>{
        return Observable.create { observer -> Disposable in
            self.alamoFireManager!.request(self.urlServer!+endPoints.login.me, method: .get, parameters: nil, encoding: URLEncoding.default, headers: nil, interceptor: nil).responseDecodable { (res: DataResponse<meModel,AFError>) in
                if let error = res.error {
                    observer.onError(error)
                } else if let valueEntitie = res.value {
                    observer.onNext(valueEntitie)
                }
                observer.onCompleted()
            }
            return Disposables.create()
        }
    }


public func entitie(entityId: String) -> Observable<entitieModel>{
        return Observable.create { observer -> Disposable in
            self.alamoFireManager!.request(self.urlServer!+endPoints.login.entities+"/"+entityId, method: .get, parameters: nil, encoding: URLEncoding.default, headers: nil, interceptor: nil).responseDecodable { (res: DataResponse<entitieModel,AFError>) in
                if let error = res.error {
                    observer.onError(error)
                } else if let valueEntitie = res.value {
                    observer.onNext(valueEntitie)
                }
                observer.onCompleted()
            }
            return Disposables.create()
        }
    }

第一个端点是具有其参数的login,然后是me,函数me响应一个id,该id是第三个请求所必需的,即entitie

我正在以这种方式制作平面图。

networkManagerShareCore.share.login(param: param)
                .flatMap { resMessageModel in
                    //saveData(resMessageModel)
                    networkManagerShareCore.share.me()
                        .flatMap { resMeModel in
                         //saveData(resMessageModel)
                         networkManagerShareCore.share.entitie(entityId: "\(resModelMe.data.personId!)")
                    }
            }.subscribe(onNext: { (model) in
                print(model)
            }, onError: { (error) in
                self.errorMsg.accept(error.localizedDescription)
                self.isSuccess.accept(false)
            }, onCompleted: nil) {
                print("Disposed")
            }

该代码有效,但是在//saveData(resMessageModel)行中我无法将其称为函数,我想保存模型,但是如果我尝试调用一个函数,Xcode会向我显示此错误:Unable to infer complex closure return type; add explicit type to disambiguate那么,我该如何解决呢?

swift alamofire rx-swift
1个回答
0
投票

RxSwift flatMap期望返回的值是一些Observable。

FlatMap运算符通过应用函数来转换Observable您指定给源Observable发出的每个项目的位置,其中该函数返回一个Observable,它本身会发出项目。

您需要在每个flatMap调用中添加return语句。另外,您需要显式定义闭包的返回类型。

所以最里面的flatMap调用应该看起来像这样:

 networkManagerShareCore.share.me()
       .flatMap { resMeModel -> Observable<entitieModel> in
             //saveData(resMessageModel)
             return networkManagerShareCore.share.entitie(entityId: "\(resModelMe.data.personId!)")

您通常不会将flatMap嵌入flatMap中,而只是按顺序组合它们以使代码更清晰。并且不要忘记处理(by :)。最终结果将如下所示:

networkManagerShareCore.share.login(param: param)
    .flatMap { resMessageModel -> Observable<meModel> in
          //saveData(resMessageModel)
          return networkManagerShareCore.share.me()
     }
     .flatMap { resMeModel -> Observable<entitieModel> in
           //saveData(resMessageModel)
           return networkManagerShareCore.share.entitie(entityId: "\(resModelMe.data.personId!)")
     }
     .subscribe(
         onNext: { (model) in
                  print(model)
         }, 
         onError: { (error) in
            self.errorMsg.accept(error.localizedDescription)
            self.isSuccess.accept(false)
         }, 
         onCompleted: nil) {
            print("Disposed")
     }
     .disposed(by: disposeBag)
© www.soinside.com 2019 - 2024. All rights reserved.