3

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

4

2 回答 2

6

Almofire.request是一个异步函数。你调用它,它会立即返回;在它实际执行请求之前。因此,println(data)在任何设置datanil. 当请求实际完成时,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?在其中的某个时间点。

于 2014-11-10T01:55:23.583 回答
-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)
于 2014-11-10T00:38:16.337 回答