2016-08-30 2 views
0

Я искал, как это сделать, но что-то просто не имеет смысла для меня, и я не могу этого сделать. Все, что мне нужно сделать, это получить данные из моей json-сессии (если это то, что вы называете). Я начал программировать около 3 недель назад, поэтому, пожалуйста, мне нужно проложить условия. Я понимаю, что это, вероятно, станет отмеченным как дубликат, но большинство ответов на эту/связанные темы для других языков, и я едва понимаю быстро, поэтому они мне не очень помогают.возвращаемое значение из сеанса json для использования за пределами сеанса

Я потратил часы, пытаясь найти ответ, и поскольку я новичок, я не знаю, правильно ли я ищу, что я ищу. Я также пробовал читать библиотеку разработчиков iOS, но я не понимаю, что это говорит мне, или я не нашел нужную секцию, потому что я все еще не могу понять это. Пожалуйста, попробуйте объяснить это, вместо того чтобы отправлять мне читать другие ресурсы.

вот моя функция

func parseData() { 

let urlString = "http://heroesjson.com/heroes.json" 
let session = NSURLSession.sharedSession() 
let url = NSURL(string: urlString)! 

session.dataTaskWithURL(url) { (data: NSData?, response:NSURLResponse?, error: NSError?) -> Void in 

    guard let responseData = data else { return } 
    var json: [[String: AnyObject]]! 

    do { 
     json = try NSJSONSerialization.JSONObjectWithData(responseData, options: NSJSONReadingOptions.AllowFragments) as! [[String: AnyObject]] 
    } 
    catch { 
     //handle error 
    } 

    var arrayToReturn = [Hero]() 
    for element in json { 
     let hero = Hero(fromDictionary: element as! [String: AnyObject]) 
     arrayToReturn.append(hero) 
    } 
    }.resume()//Closes Session.dataTaskWithURL 
} //Closes parseData() 

цель состоит в том, чтобы получить переменную JSon в моем сделай заявление, так что я могу разобрать его за пределами функции или получить мой «arrayToReturn», так что я могу сохранить его в глобальном переменную, которую я использую.

Если я правильно понял, я не могу просто присвоить значение (arrayToReturn) моей глобальной переменной (героям), потому что это асинхронный запрос, поэтому он просто возвращает nil, потому что команда вызывается до завершения запроса. Я думаю, что мне нужно использовать обработчик завершения или функцию обратного вызова. Я не понимаю разницу между ними и не понимаю как или где для их реализации.

Кроме того, я тоже не очень понимаю этот код, я просто знаю, что нужно получить то, что я хочу.

session.dataTaskWithURL(url) { (data: NSData?, response:NSURLResponse?, error: NSError?) -> Void in 

«(данные: NSData ?, ответ: NSURLResponse ?, ошибка: NSError)» выглядит как параметры, но они, кажется, не быть прикреплены к функции, так что не имеет смысла для меня

«-» Пустота «Не имеет смысла для меня, потому что -> означает возвращение того, что следует, но пустота указывает мне, что его ничего не возвращает, так почему бы просто не оставить его вместе?

"-> Пустота в" Какое значение здесь здесь? что это означает/сигнал?

ответ

1

Пойдите и прочитайте о Swift Closures. Чтобы использовать значение за его пределами, вам нужно передать его другому закрытию.

func parseData(callback: (heroes: [Hero]) -> Void) { 

let urlString = "http://heroesjson.com/heroes.json" 
let session = NSURLSession.sharedSession() 
let url = NSURL(string: urlString)! 

session.dataTaskWithURL(url) { (data: NSData?, response:NSURLResponse?, error: NSError?) -> Void in 
    guard let responseData = data else { return } 
    var json: [[String: AnyObject]]! 

    do { 
     json = try NSJSONSerialization.JSONObjectWithData(responseData, options: NSJSONReadingOptions.AllowFragments) as! [[String: AnyObject]] 
    } 
    catch { 
     //handle error 
    } 

    var arrayToReturn = [Hero]() 
    for element in json { 
     let hero = Hero(fromDictionary: element as! [String: AnyObject]) 
     arrayToReturn.append(hero) 
    } 

    callback(heroes: arrayToReturn) 
    }.resume()//Closes Session.dataTaskWithURL 
} //Closes parseData() 

И вы бы назвали:

parseData { heroes in 
    // do something with the array 
} 
+0

Я читал, что весь раздел ранее сегодня, и я до сих пор не понимаю, как сделать то, что я спрашиваю ... вот почему я прибегнул спросить здесь. Если вы можете быть более конкретным, какую часть может помочь. – Apple

+0

Я отредактировал свой ответ, может быть, теперь это имеет смысл. Если это помогает, обязательно отметьте его как лучший ответ. Благодарю. – itsProf

+0

Спасибо! Я редактировал свой код, и он работает. Мне просто нужно выяснить, как запустить этот код в начале моей программы, прежде чем остальная часть начнется, потому что программе нужны все данные, которые заполняются из этого json-синтаксиса – Apple

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