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)
}
评论中的问题:
但是可以说我想把这些数据变成一个表格。我可以将所有表格代码都放在闭包中吗?
您可以将所有代码放在闭包中,但这可能很快就会变得混乱。处理这个问题的更好方法是实现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?
在其中的某个时间点。