2017-01-23 2 views
1

Я перенес приложение из Swift 2.2 в 3.0, которое использовало метод расширения из проекта Alamofire-SwiftyJSON на GitHub. Alamofire-SwiftyJSON позволяет получить ответ от запроса сети Alamofire преобразуется в экземпляр SwiftyJSON, как это:Быстрый способ расширения для Alamofire, чтобы вернуть результат SwiftyJSON

Alamofire.request(.GET, "http://httpbin.org/get", parameters: ["foo": "bar"]) 
    .responseSwiftyJSON({ (request, response, json, error) in 
     print(json) // json is a SwiftyJSON 'JSON' instance 
     print(error) 
    }) 

Проект Alamofire-SwiftyJSON не был обновлен для Swift 3, как написать этот вопрос. Я ищу эквивалентную реализацию метода расширения responseSwiftyJSON, который работает с Swift 3+ и Alamofire 4+.

ответ

3

Методы расширения

Это решение включает в себя предложения по работе с Alamofire из SwiftyJSON readme.

Он основан на аналогичных расширений, включенных с Alamofire в ResponseSerialization.swift:

  • DataRequest.responseJSON(queue:options:completionHandler:)
  • DataRequest.jsonResponseSerializer(options:)

Это решение работает с Swift 3 и выше. Он был протестирован с Alamofire 4.2+ и SwiftyJSON 3.1.3+.

import Alamofire 
import SwiftyJSON 

extension DataRequest { 

    /// Adds a handler to be called once the request has finished. 
    /// 
    /// - parameter options:   The JSON serialization reading options. Defaults to `.allowFragments`. 
    /// - parameter completionHandler: A closure to be executed once the request has finished. 
    /// 
    /// - returns: The request. 
    @discardableResult 
    public func responseSwiftyJSON(
     queue: DispatchQueue? = nil, 
     options: JSONSerialization.ReadingOptions = .allowFragments, 
     completionHandler: @escaping (DataResponse<JSON>) -> Void) -> Self { 
      return response(
       queue: queue, 
       responseSerializer: DataRequest.swiftyJSONResponseSerializer(options: options), 
       completionHandler: completionHandler 
      ) 
    } 

    /// Creates a response serializer that returns a SwiftyJSON instance result type constructed from the response data using 
    /// `JSONSerialization` with the specified reading options. 
    /// 
    /// - parameter options: The JSON serialization reading options. Defaults to `.allowFragments`. 
    /// 
    /// - returns: A SwiftyJSON response serializer. 
    public static func swiftyJSONResponseSerializer(
     options: JSONSerialization.ReadingOptions = .allowFragments) -> DataResponseSerializer<JSON> { 
      return DataResponseSerializer { _, response, data, error in 
       let result = Request.serializeResponseJSON(options: options, response: response, data: data, error: error) 
       switch result { 
        case .success(let value): 
         return .success(JSON(value)) 
        case .failure(let error): 
         return .failure(error) 
       } 
      } 
    } 
} 

Пример использования:

Alamofire.request("https://httpbin.org/get").validate().responseSwiftyJSON { 
     response in 

     print("Response: \(response)") 

     switch response.result { 
      case .success(let json): 
       // Use SwiftyJSON instance 
       print("JSON: \(json)") 

      case .failure(let error): 
       // Handle error 
       print("Error: \(error)") 
     } 
    } 
+1

Gnarly, но элегантный, как только вы понимаете, что делает Alamofire. CompletionHandler получает вызов в потоке, на котором запущена очередь или основной поток, если очередь равна нулю. Ответ Сериализатор вызывается в NSOperationQueue внутри Alamofire. Я бы добавил вызов validate(), как в readme SWiftyJSON. – Heliotropix

+0

Спасибо за отзыв @ user992167! Я добавил метод validate(), как вы предложили. –

Смежные вопросы