#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
класс