2017-01-23 12 views
1

GitHubのAlamofire-SwiftyJSONプロジェクトの拡張メソッドを使用したSwift 2.2から3.0に移行しました。 AlamofireがSwiftyJSONの結果を返すためのSwift拡張メソッド

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プロジェクト

はこの質問を書いているようスウィフト3のために更新されませんでした:Alamofire-SwiftyJSONは次のようにSwiftyJSONインスタンスに変換Alamofireネットワーク要求からの応答を受け取ることができます。 Swift 3+とAlamofire 4+で動作する拡張メソッド responseSwiftyJSONの同等の実装を探しています。

答えて

3

拡張メソッド

このソリューションは、SwiftyJSON readmeからAlamofireで作業するための提案を採用しています。

それはResponseSerialization.swiftにAlamofireに含まれている同様の拡張子に基づいています。

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

このソリューションでは、上記スウィフト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

あなたはAlamofireが何をしているかを理解すれば危ないが、エレガント。 completionHandlerは、キューが実行されているスレッド、またはキューがnilの場合はメインスレッドで呼び出されます。 responseSerializerは、Alamofire内部のNSOperationQueueで呼び出されます。私はSWiftyJSONのreadmeのようにvalidate()の呼び出しを追加します。 – Heliotropix

+0

feedback @ user992167ありがとう!私は提案したようにvalidate()メソッドを追加しました。 –

関連する問題