Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios Alamofire返回SwiftyJSON结果的Swift扩展方法_Ios_Swift_Alamofire_Swifty Json - Fatal编程技术网

Ios Alamofire返回SwiftyJSON结果的Swift扩展方法

Ios Alamofire返回SwiftyJSON结果的Swift扩展方法,ios,swift,alamofire,swifty-json,Ios,Swift,Alamofire,Swifty Json,我将一个应用程序从Swift 2.2迁移到了3.0,它使用了GitHub上项目的扩展方法。Alamofire SwiftyJSON允许接收从Alamofire网络请求转换为SwiftyJSON实例的响应,如下所示: Alamofire.request(.GET, "http://httpbin.org/get", parameters: ["foo": "bar"]) .responseSwiftyJSON({ (request, response, json, error) in

我将一个应用程序从Swift 2.2迁移到了3.0,它使用了GitHub上项目的扩展方法。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进行更新。我正在寻找与Swift 3+和Alamofire 4+兼容的
responseSwiftyJSON
扩展方法的等效实现。

扩展方法 该解决方案包含了一项建议,用于与来自的Alamofire合作

它基于Alamofire中包含的类似扩展:

  • DataRequest.responseJSON(队列:选项:completionHandler:)
  • DataRequest.jsonResponseSerializer(选项:)
此解决方案适用于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)
                }
            }
    }
}

一旦你了解了阿拉莫菲尔在做什么,你会觉得很粗糙,但很优雅。在运行队列的线程上调用completionHandler,如果队列为nil,则在主线程上调用completionHandler。在Alamofire内部的NSOperationQueue上调用responseSerializer。我将在SWiftyJSON自述中添加对validate()的调用。感谢@user992167的反馈!我按照您的建议添加了validate()方法。
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)")
        }
    }