2016-12-03 53 views
2

我遇到了以下错误:无法将类型的值 '(_) - >可观察<Response>' 预期参数类型 '([_]) - > _'

Cannot convert value of type '(_) -> Observable<Response>' 
to expected argument type '([_]) -> _' 

,当我试图编译:

func request(_ token: MyAPI) -> Observable<Moya.Response> { 
    switch (target.requiresCSRF, target.requiresOAuth) { 
    case (false, false): return actualRequest 
    case (true, false): return CSRFTokenRequest().flatMap { _ in actualRequest } 
    case (false, true): return OAuthTokenRequest().flatMap { _ in actualRequest } 
    case (true, true): return Observable.zip([CSRFTokenRequest(), OAuthTokenRequest()]) { _ in actualRequest } 
    } 
} 

actualRequest类型为Observable<Response> 两个CSRFTokenRequest和OAuthTokenRequest类型为Observable<String?>

我试图るn CSRFTokenRequest之前OAuthTokenRequest然后实际请求。

下解决了问题...但我不知道这是做正确的方式...

return RequiresCSRFTokenRequest().flatMap{ _ in 
      self.RequiresAuthenticationRequest().flatMap{ _ in actualRequest} 
     } 



fileprivate extension Networking{ 

    func RequiresAuthenticationRequest() -> Observable<String> { 

     /// This has 3 cases 

     // 0. token is not present, error out 
     // 1. token is not expired, return token 
     // 2. token is expired, needs refresh 

     guard let jwt = AuthManager.shared.accessToken else{ 
      return .just("Error!! No access tokens") 
     } 

     // If access token is valid 
     if AuthManager.shared.expiredAccessToken == false{ 

      return .just(jwt) 

     }else{ 

      return request(.refreshAccessToken(refreshToken: AuthManager.shared.refreshTokenWithBearer!)) 
       .filterSuccessfulStatusCodes() 
       .mapObject(type: UserAuthenticationTokens.self) 
       .do(onNext: { 
        $0.save()}) 
       .map{ (token) -> String in 
        // Get new access token that was just saved 
        return AuthManager.shared.accessToken! 
      } 
     } 

    } 


    func RequiresCSRFTokenRequest() -> Observable<String> { 

     // Always get a new csrf token 
     return request(.getCSRF()) 
      .filterSuccessfulStatusCodes() 
      .mapObject(type: CSRFToken.self) 
      .do(onNext: { 
       $0.save() 
      }).map{ (token) -> String in 
       return AuthManager.shared.csrf_token! 
      } 
    } 

} 

谢谢!

+0

所有这些表达式的返回类型是什么? – Alexander

+0

它们应该是可观察的 user805981

+0

什么是'actualRequest'?我想它是返回一个'Observable 不是?请分享更多关于你的类型,很难在没有更多信息的情况下帮助你 –

回答

0

据我可以在你的代码中看到的,如果你仔细看的switch声明你的最后一个case,这两个功能CSRFTokenRequest()OAuthTokenRequest()正在返回Observables<String?>你正在创建一个新的Observable是等待都发出这样的事实。

zip为您发出两个Observable,在您的情况下,您正在使用{_ return actualRequest}省略两者。 要小心,当你要返回函数actualRequest它期望另一件事,所以这里的重点是将Observable<A>转换为Observable<B>

为此,您将需要使用flatMap函数,因为您之前做过,并且在最后一种情况下缺少它。

让我们看看和例子:

Observable.zip(Observable.just(1), Observable.just("!")) { (a, b) in 
    return (a,b) 
} 
.flatMap { _ in return Observable.just(4.0) } 
.subscribe(onNext: { value in 
    print(value) 
}) 
.addDisposableTo(disposeBag) 

在上述情况下,我省略了Observable<Int>Observable<String>的两个值,以创建一个新的Observable<Double>

在你的情况,你应该做这样的事情:

return Observable.zip(CSRFTokenRequest(), OAuthTokenRequest()).flatMap { _ in actualRequest } 

我希望这可以帮助您

+0

我更新了我的帖子,以解决问题的方式....但我不知道这是否是正确的方式来平面地图...你会怎么样建议? – user805981

+0

@ user805981不,建议不要将嵌套调用放到Observables中,而应该使用类似'flatMap'的链接,请参阅我的更新回答 –

+0

'无法转换类型'Observable '的值(又名'Observable > ')to expected argument type'([_])throws - > _''使用你的方法现在给我以下...是否有某种类型的演员必须为Observables完成? – user805981

相关问题