使用Alamofire发布请求后,Swift变量不保留其值

时间:2017-03-11 21:13:48

标签: ios swift alamofire

我试图在发布帖子请求后抓取响应并以这种方式将其存储到变量中:

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语句时仍在进行请求,因此仍将其设置为其默认值。有没有人为此找到了解决方法?我已经尝试使用完成处理程序,将请求主体封装在主线程块中,但没有任何作用。如果有人知道解决方案,我会非常感激。

1 个答案:

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