我正在使用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
....任何想法?我知道请求很好,因为当我不将它分配给变量时,我可以看到范围内的响应。
答案 0 :(得分:6)
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?
以外的其他位置。
答案 1 :(得分:-1)
这是因为当你执行let data: AnyObject? = JSON
时,你在闭包中创建了一个新的局部变量data
。
你应该这样做:
var data: NSData?
Alamofire.request(.POST, "http://localhost/api/notifications", parameters: parameters)
.responseJSON { (request, response, JSON, error) in
data = JSON
}
println(data)