我试图在发布帖子请求后抓取响应并以这种方式将其存储到变量中:
var databaseId:String = ""
Alamofire.request(url, method: post, parameters: paramters).responseJSON { response in
let jsonData = JSON(data: response.data!)
self.databaseId = jsonData["id"].stringValue
//databaseId has the right value in here but when I try to use it out side of this request it does't retain its value
}
print(databaseId) //will be ""
我明白为什么会这样。在执行此print语句时仍在进行请求,因此仍将其设置为其默认值。有没有人为此找到了解决方法?我已经尝试使用完成处理程序,将请求主体封装在主线程块中,但没有任何作用。如果有人知道解决方案,我会非常感激。
答案 0 :(得分:0)
“我理解为什么会这样。”
显然,你不明白。 (我不是故意讽刺,但你错过了关于异步函数的基本观点。)
在像AlamoFire.request这样的异步调用中,您进行调用并传入一个闭包,该闭包将在请求完成后运行。
func fetchDataBaseID(myFunctionClosure: ()-> Void ) {
//Step 1.
Alamofire.request(url, method: post, parameters: paramters).responseJSON {
//Step 3.
response in
let jsonData = JSON(data: response.data!)
self.databaseId = jsonData["id"].stringValue
//databaseId has the right value in here
//but when I try to use it out side of this request it does't retain its value
//Put your code that needs the results here:
//Step 4.
myFunctionClosure() //Uses databaseID
}
//Step 2.
print(databaseId) //will be ""
我在上面添加了步骤编号。在第1步中,我们即将提交AlamoFire.request()
命令。
下一步2执行。此时,AlamoFire请求仍处于暂挂状态,数据不可用。 print语句显示没有databaseId,但这是正常的。
在将来某个时间,也许是2秒之后,也许是30秒之后,在您的程序关闭其他内容后,请求将完成加载。在那时候。 AlamoFire接受您在步骤1中给出的闭包,并运行该代码。 现在第3步的代码运行。
最后,调用一个传递给函数的闭包,该闭包将在数据可用时运行。
您可以像上面这样使用上述功能:
fetchDatabaseID() {
print("database ID = \(self. databaseId)")
}