次のエラーが発生しました。
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?>
OAuthTokenRequestの前にCSRFTokenRequestを実行してから、実際のリクエストを実行しようとしています。
以下は問題を解決します...しかし、これが正しい方法であるかどうかはわかりません...
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!
}
}
}
ありがとう!