尝试全局访问响应

时间:2014-11-10 00:25:28

标签: ios json xcode swift alamofire

我正在使用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 ....任何想法?我知道请求很好,因为当我不将它分配给变量时,我可以看到范围内的响应。

2 个答案:

答案 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)