gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-11-01 06:17:15 25 4
gpt4 key购买 nike

我将应用程序从 Swift 2.2 迁移到 3.0,它使用了 Alamofire-SwiftyJSON 中的扩展方法GitHub 上的项目。 Alamofire-SwiftyJSON 允许接收来自转换为 SwiftyJSON 实例的 Alamofire 网络请求的响应,如下所示:

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 扩展方法的等效实现。

最佳答案

扩展方法

此解决方案包含来自 SwiftyJSON readme 的关于使用 Alamofire 的建议.

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

  • DataRequest.responseJSON(queue:options: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)
}
}
}
}

使用示例:

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)")
}
}

关于ios - Alamofire 返回 SwiftyJSON 结果的 Swift 扩展方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41800212/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com