Moya 8 to 16, Swift 3.2 to 5 (как переписать код?)
Есть код написаный под Swift 3.2 и Moya 8 версии. Он работал, а при переходе на Swift 5 и Moya 16 версии выдает ошибки:
Missing argument for parameter 'completion' in call
Value of type 'Cancellable' has no member 'catchError'
let NetworkProvider = MoyaProvider<Network>(endpointClosure: endpointClosure,
plugins: plugins)
class NetworkAPI {
private init() { }
private class func requestWrapper(_ token: Network) -> Observable<Response> {
return NetworkProvider
.request(token) // 1 -ошибка
.catchError({ (error: Swift.Error) -> Observable<Response> in // 2-ошибка
guard let moyaError: MoyaError = error as? MoyaError else {
throw error
}
guard case let MoyaError.underlying(underlyingError) = moyaError else {
throw error
}
guard let afError: AFError = underlyingError as? AFError,
afError.responseCode == 401
else { throw error }
return refreshToken()
.flatMap({ (_: RefreshResult) -> Observable<Response> in
return NetworkProvider.request(token)
})
})
}
}
Не могу понять, что тут изменилось у Moya, чтобы все заработало, поэтому прошу помощи.
Попробовал сделать так:
class NetworkAPI {
private init() { }
private class func requestWrapper(_ token: Network) -> Observable<Response> {
return NetworkProvider.rx //тут изменения
.request(token)
.asObservable() //тут добавлено
.catchError({ (error: Swift.Error) -> Observable<Response> in
guard let moyaError: MoyaError = error as? MoyaError else {
throw error
}
guard case let MoyaError.underlying(underlyingError) = moyaError else {
throw error
}
guard let afError: AFError = underlyingError as? AFError,
afError.responseCode == 401
else { throw error }
return refreshToken() // 1-ошибка
.flatMap({ (_: RefreshResult) -> Observable<Response> in // 2-ошибка
return NetworkProvider.request(token)
})
})
}
}
Появилась ошибки в другом месте:
- Declared closure result 'Cancellable' is incompatible with contextual type 'Observable'
- Missing argument for parameter 'completion' in call
Вообщем нужна помощь...
Ответы (1 шт):
Автор решения: Петров Кирилл
→ Ссылка
Во втором запросе тоже нужен был .rx и немного изменился тип ответа. Вдруг кому пригодиться:
class NetworkAPI {
private init() { }
private class func requestWrapper(_ token: Network) -> Observable<Response> {
return NetworkProvider.rx
.request(token)
.asObservable()
.catchError({ (error: Swift.Error) -> Observable<Response> in
guard let moyaError: MoyaError = error as? MoyaError else {
throw error
}
guard case let MoyaError.underlying(underlyingError) = moyaError else {
throw error
}
guard let afError: AFError = underlyingError as? AFError,
afError.responseCode == 401
else { throw error }
return refreshToken()
.flatMap({ (_: RefreshResult) -> Single<Response>
return NetworkProvider.rx.request(token)
})
})
}
}