我正在使用 Alamofire,当我收到响应时,我试图将其设置为一个我可以在任何地方访问的变量。这就是我要做的事情
var data: NSData?
Alamofire.request(.POST, "http://localhost/api/notifications", parameters: parameters)
.responseJSON { (request, response, JSON, error) in
let data: AnyObject? = JSON
}
println(data)
当我运行它时,我得到 nil
....有什么想法吗?我知道请求很好,因为当我不将其分配给变量时,我可以在范围内看到响应。
最佳答案
Almofire.request
是一个异步函数。你调用它,它会立即返回;在它实际执行请求之前。因此,println(data)
在将 data
设置为 nil
之外的任何内容之前被调用。当请求实际完成时,Alamofire 将调用您传递给 responseJSON
的闭包,在该闭包中您将要实际使用 data
(打印它或其他) :
Alamofire.request(.POST, "http://localhost/api/notifications", parameters: parameters)
.responseJSON { (request, response, JSON, error) in
let data: AnyObject? = JSON
// do something useful with data
println(data)
}
来自评论的问题:
But then lets say I want to turn that data into a table. Would I just put all the table code inside the closure?
您可以将所有代码放入闭包中,但这可能很快就会变得困惑。一个更好的处理方法是实现 Alamofire.request
正在使用的相同类型的模式。基本上,让你的请求成为它自己的函数将接受一个闭包作为参数。然后,在您传递给 responseJSON
的闭包中,调用传递给您的函数的闭包,传递给它 data
。然后,创建一个单独的函数来“将数据转换为表格”,并使用闭包中的 data
调用它。像这样:
func callSomeAPI(resultHandler: (data: AnyObject?) -> ()) -> () {
Alamofire.request(.POST, "http://localhost/api/notifications", parameters: parameters)
.responseJSON { (request, response, JSON, error) in
let data: AnyObject? = JSON
resultHandler(data)
}
}
func makeTable(data: AnyObject?) -> () {
// make your table
}
callSomeAPI() { data in
makeTable(data)
}
注意:您可能希望在某些时候将 data
转换为 AnyObject?
以外的内容。
关于ios - 试图在全局范围内访问响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26835004/