RxMoya Network и Service Обработка ошибок в одной и той же функции - PullRequest
0 голосов
/ 23 сентября 2018

Я пытаюсь реализовать функцию, которая обрабатывает ошибки сети и API, моя проблема заключается в том, как снова генерировать наблюдаемое после filterSuccessfulStatusCodes ().Основная проблема, с которой я столкнулся, заключается в том, что я не уверен в правильности этого подхода после первой подписки.

Текущая ошибка в этом коде: дополнительный аргумент 'onError' в вызове

func Request<T: Decodable>(_ request: APIManager) -> 
Observable<Result<T>> {
    provider.rx
        .request(request)
        .subscribe(onSuccess: { (response) in
            try response.filterSuccessfulStatusCodes()
            return Observable.just(response)
                .subscribe { event in
                    switch event {
                    case .success:
                        .map(RequestResponse<T>.self)
                            .map { $0.result! }
                            .asObservable()
                            .map(Result.success)
                            .catchError { error in
                                return .just(.error(withMessage: "Error \(error)"))
                        }
                    case .error:
                        print("error")
                    }
            }

        }, onError: { (error) in
            print("network request error")

        }, onCompleted: {
            print("network request on completed")
        }).disposed(by: disposeBag)
}

 struct RequestResponse<T: Decodable> {
    let statusCode: Int
    let statusMessage: String
    let success: Bool
    let result: T?
    let errorBag: String?
 }

 enum Result<T: Decodable> {
    case success(T)
    case error(withMessage: String)
 }

Ответы [ 2 ]

0 голосов
/ 24 сентября 2018

Вы можете попробовать что-то вроде этого, который преобразует Single в Observable, затем вызывает filterSuccessfulStatusAndRedirectCodes, и вы можете обработать ошибки в catchError closure

func Request<T: Decodable>(_ request: APIManager) -> Observable<Result<T>> {
        self.sharedProvider.rx
                .request(request)
                .asObservable()
                .filterSuccessfulStatusAndRedirectCodes()
                .map(RequestResponse<T>.self)
                .map { Result.success }
                .catchError { error in
                    if let moyaError = error as? MoyaError {
                        return Objservable.error(handleNetworkError(withMoyaError: moyaError))
                    } else {
                        return Observable.error(error)
                    }
                 }
}
0 голосов
/ 23 сентября 2018

Это моя начальная функция, которая прекрасно работает, но я не понимаю, как выполнить проверку сети и API-ошибок.

func getA(_ request: APIManager) -> Observable<Result<[A]>> {
    return request(request)
}

func request<T: Decodable>(_ request: APIManager) -> Observable<Result<T>> {
    return provider.rx
        .request(request)
        .map(RequestResponse<T>.self)
        .map { $0.result! }
        .asObservable()
        .map(Result.success)
        .catchError { error in
            return .just(.error(withMessage: "Failed \(error)"))
    }
}
...