Как правильно filterSuccessfulStatusCodes в RxMoya

Я использую RxMoya, и мне было интересно узнать об использовании fiterSuccesfulStatusCodes, я попытаюсь описать, в чем моя проблема ... Итак, когда вы используете какой-то сетевой вызов, подобный этому

func getAllApps(gwId: Int) -> Observable<Response> {
    return provider.request(RestAPI.GetAllApps(gwId: gwId)).filterSuccessfulStatusCodes()
}

Когда вы получите ответ с кодом состояния выше 299, ничего не произойдет, моя проблема в том, что я хотел бы отображать сообщение об ошибке пользователю, но когда вы проверяете, что делает filterSuccessfulStatusCodes:

public func filterSuccessfulStatusCodes() -> Observable<E> {
    return flatMap { response -> Observable<E> in
        return Observable.just(try response.filterSuccessfulStatusCodes())
    }
}

Теперь мы приближаемся к моей проблеме. Итак, реализация filterSuccessfulStatusCodes использует функцию публичного экземпляра Moya.Resposne с этой реализацией:

public func filterSuccessfulStatusCodes() throws -> Response {
    return try filterStatusCodes(200...299)
}

Как видите, эта вещь генерирует исключения ... но функция выше не генерирует повторно, она возвращает Observable общего типа E.

Мой первый вопрос: как так получилось, что вы можете использовать return Observable.just (попробуйте response.filterSuccessfulStatusCodes ()), когда функция не бросает / не возвращает. Вы можете использовать try withou do / chatch? (Я знаю, что с помощью try! / Try? Вы можете, но с помощью try, я могу только представить случай с повторным запуском).

Второй вопрос, есть ли способ реагировать на коды состояния ошибки на уровне наблюдаемых.

Спасибо


person beretis    schedule 21.10.2016    source источник


Ответы (1)


  • try response.filterSuccessfulStatusCodes() используется не в filterSuccessfulStatusCodes(), а в flatMap.

    Если мы посмотрим на определение flatMap на Observable, мы получим

    func flatMap<O: ObservableConvertibleType>(_ selector: @escaping (E) throws -> O)
      -> Observable<O.E>
    

    selector здесь выкидывает, поэтому мы можем использовать try.

  • Когда что-то бросается в цепочку наблюдаемых объектов, наблюдаемое завершается с ошибкой. Таким образом, вы сможете реагировать на неудачный код состояния в селекторе onError вызова подписки (или используя catch, retry и другие операторы, которые действуют при ошибках).

    getAllApps(gwId: Int)
      .subscribe(onNext: {
        debugPrint("Success with \($0)")
      }, onError: { error in
        switch error {
        case Moya.Error.statusCode(let response):
          debugPrint("Invalid status code \(response.statusCode)")
        default:
          debugPrint("An error occured: \(error)")
        }
      })
    
person tomahh    schedule 24.10.2016
comment
Спасибо, позже я заметил эту область ... но вы дали отличный ответ, как обрабатывать неудачные ответы - person beretis; 24.10.2016