尝试全局访问响应

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

以上是关于尝试全局访问响应的主要内容,如果未能解决你的问题,请参考以下文章

使用 C++ 访问 Lua 全局表

C++ 错误:尝试访问全局变量时变量未命名类型

访问 Vue3 全局组件

从匿名函数汇编脚本访问全局变量

尝试从 Azure AD 获取访问令牌时获取响应代码 400

如何访问全局变量