2016-12-03 47 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

相關問題