对不起,我的英语不好 :)
我在Swift中针对iOS应用程序解析Alamofire上的JSON响应时遇到问题 . 我写了一个函数来返回一个JSON响应字符串 . 请求和响应处理我使用Alamofire和JSON处理我使用SwiftyJSON . 在开始时,我声明一个名为 jsonString 的var,其值为 test . 然后,我向REST服务发出请求,并通过单击按钮获取JSON响应 . 这个响应我想用函数 ping(url:String) 返回 . 最后,我打印返回的响应作为测试 . 但是在第一次单击按钮时, ping 的返回值是 test 而不是响应的JSON字符串 . 在第二次单击按钮时,我得到正确的返回值 . 为什么我有这个问题 . Alamofire请求是异步操作吗?我想等待回应 . 如何解决问题以便在第一次点击时获得正确的值而不是 test 作为值?
这是我的代码:
var jsonString:String = "test"
func ping(url:String) -> String {
Alamofire.request(.GET, url)
.response {
(request, response, data, error) -> Void in
let json = JSONValue(data as? NSData)
self.jsonString = json.rawJSONString
}
return self.jsonString
}
@IBAction func checkOnlineStatus(sender: UIButton) {
let response:String = ping("http://test.com")
println(response)}
4 回答
在第一次单击时,代码
将运行之前
你将在第一次从self.jsonString获得nil,你第二次点击将获得第一次点击的请求数据 .
如果您使用SwiftyJSON和Alamofire,您可以尝试Alamofire-SwiftyJSON
你也可以尝试跑步
您遇到的问题是您试图同步返回异步方法的结果 .
你有两个解决方案:
异步返回结果
等待异步调用完成
我've written a response to this very same question a few minutes ago on this thread, I' ll建议你看一下:https://stackoverflow.com/a/33130512/422288
呼叫方法
让aParams:[String:String] = [“ReqCode”:Constants.kRequestCodeLogin,“StoreDCID”:strStoreID!,“CustEmail”:dictAddLogin [AddLoginConstants.kEmail]!,“Password”:dictAddLogin [AddLoginConstants.kPassword]!,“ DeviceID“:”DeviceIDString“,”DeviceType“:”iOS“,]