如何解决将 Alamofire 请求转换为 URLSession 请求
我有这个 JSON 响应 -
我已经按照 this blog 进行了 api 调用并解码了响应。他们的代码片段 -
func searchPlaces(query: String) {
let urlStr = "\(mapBox_api)\(query).json?access_token=\(mapBox_access_token)"
print(urlStr)
Alamofire.request(urlStr,method: .get,parameters: nil,encoding: URLEncoding.default,headers: nil).responseSwiftyJSON { (dataResponse) in
if dataResponse.result.isSuccess {
let resJson = JSON(dataResponse.result.value!)
if let myjson = resJson["features"].array {
for itemobj in myjson ?? [] {
try? print(itemobj.rawData())
do {
let place = try self.decoder.decode(Feature.self,from: itemobj.rawData())
self.searchedplaces.add(place)
self.tableView.reloadData()
} catch let error {
if let error = error as? DecodingError {
print(error.errorDescription)
}
}
}
}
}
if dataResponse.result.isFailure {
let error : Error = dataResponse.result.error!
}
}
}
在这里,他们通过 for 循环获取每个特征项,然后对其进行解码并将其附加到数组中。 我想通过使用 URLSession转换。但是这部分他们使用了 dataResponse.result 这在 URLSession 中是不可用的 -
if dataResponse.result.isSuccess {
let resJson = JSON(dataResponse.result.value!)
if let myjson = resJson["features"].array {
for itemobj in myjson ?? [] {
try? print(itemobj.rawData())
do {
let place = try self.decoder.decode(Feature.self,from: itemobj.rawData())
self.searchedplaces.add(place)
self.tableView.reloadData()
}
那么如何使用 URLSession 转换这个 dataResponse.result 部分?
可编码结构(这是它们用于 alamofire 请求)-
struct Feature: Codable {
var id: String!
var type: String?
var matching_place_name: String?
var place_name: String?
var geometry: Geometry
var center: [Double]
var properties: Properties
}
struct Geometry: Codable {
var type: String?
var coordinates: [Double]
}
struct Properties: Codable {
var address: String?
}
解决方法
如果您想使用 URLSession
,这是一个可能的解决方案:
let session = URLSession.shared
let url = URL(string: "https://YOUR_URL")!
let task = session.dataTask(with: url,completionHandler: { data,response,error in
// Check the response
print(response)
// Check if an error occured
if error != nil {
// HERE you can manage the error
print(error)
return
}
// Serialize the data into an object
do {
let json = try JSONDecoder().decode(FullResponse.self,from: data!)
//try JSONSerialization.jsonObject(with: data!,options: [])
print(json)
DispatchQueue.main.async {
// pass data to main thread
}
} catch {
print("Error during JSON serialization: \(error.localizedDescription)")
}
})
task.resume()
您可能需要为 FullResponse 创建一个结构体。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。