2016-01-10 2 views
2

В моем приложении я использую библиотеки Moya и Alamofire (а также Moya/RxSwift и Moya-ObjectMapper) для всех сетевых запросов и ответы.Как обрабатывать ответ всех типов запросов в одном обработчике, но также однозначно обрабатывать каждый запрос с помощью Alamofire и Moya

Я хотел бы обработать ответ всех типов запросов в одном обработчике, но также однозначно обрабатывать каждый запрос.

Например, для любого запроса я могу получить ответ «Недействительная версия», я хотел бы избежать, чтобы проверить каждый ответ, если эта ошибка прибыла.

Есть ли элегантный способ использовать этот прецедент с Moya?

ответ

4

Видимо, это очень просто, вам просто нужно создать свой собственный плагин. И добавить к экземпляру поставщика (Вы можете добавить его в функции инициализации)

Например:

struct NetworkErrorsPlugin: PluginType { 

    /// Called immediately before a request is sent over the network (or stubbed). 
    func willSendRequest(request: RequestType, target: TargetType) { } 

    /// Called after a response has been received, but before the MoyaProvider has invoked its completion handler. 
    func didReceiveResponse(result: Result<Moya.Response, Moya.Error>, target: TargetType) { 

     let responseJSON: AnyObject 
     if let response = result.value { 
      do { 
       responseJSON = try response.mapJSON() 
       if let response = Mapper<GeneralServerResponse>().map(responseJSON) { 
        switch response.status { 
        case .Failure(let cause): 
         if cause == "Not valid Version" { 
          print("Version Error") 
         } 
        default: 
         break 
        } 
       } 
      } catch { 
       print("Falure to prase json response") 
      } 
     } else { 
      print("Network Error = \(result.error)") 
     } 
    } 
} 
+0

Как сделать запрос с использованием Moya, который завершает закрытие по мере необходимости? – iAviator

0

Я предлагаю использовать общий параметризованный метод.

class DefaultNetworkPerformer { 
    private var provider: RxMoyaProvider<GitHubApi> = RxMoyaProvider<GitHubApi>() 


    func performRequest<T:Mappable>(_ request: GitHubApi) -> Observable<T> { 
     return provider.request(request).mapObject(T.self) 
    } 
} 

DefaultNetworkPerformer будет обрабатывать все запросы от вас Мойя TargetType. В моем случае это было GitHubApi. Пример использования данной реализации является:

var networkPerformer = DefaultNetworkPerformer() 
let observable: Observable<User> = networkPerformer.performRequest(GitHubApi.user(username: "testUser")) 

здесь вы сообщите 'сети исполнителя, что ответ будет содержать User объект.

observable.subscribe { 
    event in 
    switch event { 
    case .next(let user): 
     //if mapping will succeed here you'll get an Mapped Object. In my case it was User that conforms to Mappable protocol 
     break 
    case .error(let error): 
     //here you'll get MoyaError if something went wrong 
     break 
    case .completed: 
     break 
    } 
} 
Смежные вопросы