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?
в какой-то момент там.
Итак, вы говорите, что я не могу получить доступ к константе 'data' за пределами' .responseJSON'? .... – user302975
Это не значит, что вы не можете получить к ней доступ, это значит, что он не будет установлен до тех пор, пока не будет вызвано закрытие, переданное 'responseJSON'. Поскольку запрос будет выполнен асинхронно, 'data' не будет установлен, если вы в настоящее время пытаетесь его вызвать.Если бы я знал больше о том, что вы хотите делать с «данными» (кроме печати) после его установки, я мог бы указать вам в правильном направлении. –
'data' - это ответ JSON. Я хочу взять этот JSON и распечатать его «красиво». Как «Имя: Боб» или «Возраст: 22». Не '{-data: [Имя: Bob, Возраст:" 22 "]}' Понимаете? – user302975