尝试全局访问响应
Posted
技术标签:
【中文标题】尝试全局访问响应【英文标题】:Trying to access response globally 【发布时间】:2014-11-10 00:25:28 【问题描述】:我正在使用 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
....有什么想法吗?我知道请求很好,因为当我不将响应分配给变量时,我可以在范围内看到响应。
【问题讨论】:
【参考方案1】: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)
来自 cmets 的问题:
然后假设我想将这些数据转换为表格。我可以将所有表格代码都放在闭包中吗?
您可以将所有代码放入闭包中,但这可能很快就会变得混乱。处理这个问题的更好方法是实现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?
以外的其他值。
【讨论】:
所以你是说我无法访问data
之外的.responseJSON
常量?....
这并不是你不能访问它,而是在传递给responseJSON
的闭包被调用之后才会被设置。由于请求将异步发出,因此当您当前尝试调用它时,不会设置 data
。如果我知道更多关于你想在设置后对data
做什么(而不是打印它),我可能会为你指出正确的方向。
data
是 JSON 响应。我想把那个 JSON 打印出来“漂亮”。喜欢Name: Bob
,或Age: 22
。不是 -data:[Name: Bob, Age: "22"]
明白吗?
好吧,如果你真的只是想打印它,而不是别的,那么只需将 println
语句放在闭包中就可以了。
但是可以说我想把这些数据变成一个表格。我可以将所有表格代码都放在闭包中吗?【参考方案2】:
这是因为当您执行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)
【讨论】:
这也将打印nil
,但出于不同的原因。
我做了data = JSON as? NSData
,打印时我仍然得到nil
,然后是(lldb)
@AaronBrager
是的,这是因为在您尝试打印数据时尚未收到数据。
您还应该将data
声明为字典,而不是NSData
。
好吧,我正在尝试打印 我设置了data = JSON as? NSDictionary
。当你说没有及时收到时,我不知道还能做什么。这是我第一次使用 HTTP 和 Swift,很抱歉这么基础。 @AaronBrager以上是关于尝试全局访问响应的主要内容,如果未能解决你的问题,请参考以下文章