Пользовательская оболочка API RxSwift

#ios #swift #rx-swift

#iOS #swift #rx-swift

Вопрос:

Я пытаюсь обернуть свои вызовы API с помощью RxSwift. Я не использую какую-либо стороннюю библиотеку для этих вызовов. Проблема, с которой я сталкиваюсь, связана с пользовательским объектом ошибки. Все вызовы API возвращают стандартный объект ошибки JSON. Это пример:

 {
  "error": {
     "code": 11001,
     "message": "Bad request",
     "errors": [
            "The accesstoken field is required."
            ]
  }
}
  

Это код, который отправит запрос API

 func CallAPI(withParameters parameters: [String : AnyObject]?,
             queryToSearchFor query: String?) -> Observable<AnyObject?>? {

    return Observable.create({ (observable) -> Disposable in
        ServerInterface.getRequest(
            withBaseURl: nil,
            withFunctionName: "util/load_companies/"   (query ?? ""),
            havingFunctionsParameters: nil,
            andHeaderParameters: parameters,
            withCompletionHandler: { (response) in
                guard response.responseCode == kSuccessCode else {
                    observable.on(.error( response.responseError  as! Error))
                    return
                }

                observable.on(.next(response.responseData))
                observable.on(.completed)
        })
        return Disposables.create {
            print("Request Cancelled")
        }
    })

}
  

ServerInterface.getRequest() имеет обработчик завершения типа ServerInterfaceResponse , который содержит ServerInterfaceError . Этот объект я хочу использовать ObserverOn , когда API возвращает ошибку
Проблема появляется в этой строке

observable.on(.error( response.responseError as! Error))

Во время выполнения происходит сбой с ошибкой

«не удалось преобразовать значение типа ServerInterfaceError» в «Error»

Вот мой пользовательский объект ошибки

 class ServerInterfaceError: NSObject, Error {
    var errorCode: Int?
    var errorMessage: String?
    var errorDebugger: [String]?

    func error(_ code: Int?, message: String?,
               debugger: [String]?) -> ServerInterfaceError {

        let serverError = ServerInterfaceError.init()
        serverError.errorCode = code
        serverError.errorMessage = message
        serverError.errorDebugger = debugger

        return serverError

    }
}
  

Вот мой пользовательский объект APIResponse. она содержит свойство a responseError типа ServerInterfaceError.

 class ServerInterfaceResponse: NSObject {
    var responseCode: Int?
    var responseData: AnyObject?
    var responseMessage: String?
    var responseError: ServerInterfaceError?

    func response(_ code: Int?, data: AnyObject?, message: String?, error: ServerInterfaceError?) -> ServerInterfaceResponse {
         let serverResponse = ServerInterfaceResponse.init()
         serverResponse.responseCode = code
         serverResponse.responseData = data
         serverResponse.responseMessage = message
         serverResponse.responseError = error

        return serverResponse
    }

    override var description: String {
      return "Response Code = (responseCode) | Response Data = (responseData) | Response Message = (responseMessage) | Response Error = {(responseError)}"
    }
}
  

Как я могу отправить пользовательский объект в observable.on(.error( ))

Комментарии:

1. В чем проблема с «не удается преобразовать мой пользовательский объект error в Error»? Вы не говорите, в чем проблема. Ошибка во время компиляции? Ошибка во время выполнения? Вы должны иметь возможность отправлять свою пользовательскую ошибку как ошибку, однако вам нужно будет привести ее обратно к вашему пользовательскому типу, поскольку RxSwift поддерживает только ошибки, являющиеся просто Error .

2. @wasim, в сообщении об ошибке упоминается ServerInterfaceResponseError . Как выглядит ее объявление? Она должна принимать Error протокол.

3. @AntonBronnikov Мне жаль, что это не так ServerInterfaceResponseError . это ServerInterfaceError . Класс указан в вопросе

4. Как ServerInterfaceResponse тогда выглядит? В частности, это входной аргумент response , каков его тип и объявление этого типа?

5. Я обновил вопрос и добавил ServerInterfaceResponse класс