2014-11-10 3 views
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 .... Есть идеи? Я знаю, что запрос хорош, потому что я вижу ответ внутри области действия, когда я не назначаю его переменной.

ответ

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? в какой-то момент там.

+0

Итак, вы говорите, что я не могу получить доступ к константе 'data' за пределами' .responseJSON'? .... – user302975

+0

Это не значит, что вы не можете получить к ней доступ, это значит, что он не будет установлен до тех пор, пока не будет вызвано закрытие, переданное 'responseJSON'. Поскольку запрос будет выполнен асинхронно, 'data' не будет установлен, если вы в настоящее время пытаетесь его вызвать.Если бы я знал больше о том, что вы хотите делать с «данными» (кроме печати) после его установки, я мог бы указать вам в правильном направлении. –

+0

'data' - это ответ JSON. Я хочу взять этот JSON и распечатать его «красиво». Как «Имя: Боб» или «Возраст: 22». Не '{-data: [Имя: Bob, Возраст:" 22 "]}' Понимаете? – user302975

-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) 
+3

Это также напечатает 'nil', но по другой причине. –

+0

Я сделал 'data = JSON as? NSData', и при печати я все равно получаю 'nil', а затем' (lldb) '@AaronBrager – user302975

+0

Да, это потому, что данные не были получены к тому моменту, когда вы пытаетесь его распечатать. –

Смежные вопросы