我对 Swift 3 非常陌生,我必须在我的 API 上执行 GET 请求。我正在使用 Alamofire,它使用异步函数。
我在 Android 应用程序上执行完全相同的操作,并且 GET 返回 JSON 数据
这是我的 swift 代码:
func getValueJSON() -> JSON {
var res = JSON({})
let myGroup = DispatchGroup()
myGroup.enter()
Alamofire.request(url_).responseJSON { response in
res = response.result.value as! JSON
print("first result", res)
myGroup.leave()
}
myGroup.notify(queue: .main) {
print("Finished all requests.", res)
}
print("second result", res)
return res
}
但是我对“res = response.result.value”行有疑问,这给了我错误:
线程 1:信号 SIGABRT
我真的不明白问题出在哪里,做一个“同步”功能相当困难,也许我做错了。
我的目标是将请求的结果存储在我返回的变量中。有人可以帮忙吗?
我建议您将 Alamofire 与 SwiftyJSON 一起使用,因为这样您将能够更轻松地解析 JSON。
这是一个经典的例子:
Alamofire.request("http://example.net", method: .get).responseJSON { response in
switch response.result {
case .success(let value):
let json = JSON(value)
print("JSON: \(json)")
case .failure(let error):
print(error)
}
}
如果需要传递
parameters
或headers
,只需在request
方法中添加即可。
let headers: HTTPHeaders = [
"Content-Type:": "application/json"
]
let parameters: [String: Any] = [
"key": "value"
]
所以你的请求将是这样的(这是 POST 请求):
Alamofire.request("http://example.net", method: .post, parameters: parameters, encoding: JSONEncoding.default, headers: headers).responseJSON { response in
switch response.result {
case .success(let value):
print(value)
case .failure(let error):
print(error)
}
}
我还没有测试过,但它应该可以工作。另外,如果您想允许通过 HTTP 协议发出请求,则需要将
allow arbitary load
设置为 yes
(App Transport Security Settings
中的 info.plist
)。
不推荐这样做,但对于开发来说这是很好的。