JSON analizzando rapidamente, l’array non ha valore al di fuori di NSURLSession

Sto provando a chiamare un webservice json in swift, con il seguente codice e visualizzarlo in tableview in IOS veloce.

 /*declared as global*/ var IdDEc = [String]() // string array declared globally //inside viewdidload let url = NSURL(string: "http://192.1.2.3/PhpProject1/getFullJson.php") let task = NSURLSession.sharedSession().dataTaskWithURL(url!) {(data, response, error) in let json1 = NSString(data: data!, encoding: NSUTF8StringEncoding) print("json string is = ",json1) // i am getting response here let data = json1!.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false)  do {    let json = try NSJSONSerialization.JSONObjectWithData(data!, options: .MutableContainers) as! NSArray      for arrayData in json {        let notId = arrayData["ID"] as! String        self.IdDEc.append(notId)      }      print(" id = ",IdDEc) //here i am getting values    } catch let error as NSError {      print("Failed to load: \(error.localizedDescription)")    }    print(" id out count = ",self.IdDEc.count) //here also  }  print(" id out count = ",self.IdDEc.count) // not here  task.resume() 

ho dichiarato l’array IdDEc come globale, ma l’ambito di tale array risiede solo in NSURLSession,

Inoltre voglio usare questa matrice per popolare tableview. Ecco il file di output di JSON di esempio

 [ {"ID":"123" , "USER":"philip","AGE":"23"}, {"ID":"344","USER":"taylor","AGE":"29"}, {"ID":"5464","USER":"baker","AGE":"45"}, {"ID":"456","USER":"Catherine","AGE":"34"} ] 

Sono un newbee in rapido per favore aiuto

L’idea è di usare un “callback”.

Ecco, ne ho realizzato uno per il NSArray che vuoi ottenere:

 completion: (dataArray: NSArray)->() 

Creiamo una funzione per ottenere l’array e aggiungiamo questo callback alla firma della funzione:

 func getDataArray(urlString: String, completion: (dataArray: NSArray)->()) 

e non appena la matrice è pronta useremo la richiamata:

 completion(dataArray: theNSArray) 

Ecco come potrebbe apparire la funzione completa:

 func getDataArray(urlString: String, completion: (dataArray: NSArray)->()) { if let url = NSURL(string: urlString) { NSURLSession.sharedSession().dataTaskWithURL(url) {(data, response, error) in if error == nil { if let data = data, json1 = NSString(data: data, encoding: NSUTF8StringEncoding), data1 = json1.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false) { do { let json = try NSJSONSerialization.JSONObjectWithData(data1, options: []) if let jsonArray = json as? NSArray { completion(dataArray: jsonArray) } } catch let error as NSError { print(error.localizedDescription) } } else { print("Error: no data") } } else { print(error!.localizedDescription) } }.resume() } } 

Ora usiamo questa funzione in questo modo, non più problemi asincroni:

 getDataArray("http://192.1.2.3/PhpProject1/getFullJson.php") { (dataArray) in for dataDictionary in dataArray { if let notId = dataDictionary["ID"] as? String { self.IdDEc.append(notId) } } print("id out count = ", self.IdDEc.count) } 

Aggiornamento Swift 3 + correzioni e miglioramenti.

 func getContent(from url: String, completion: @escaping ([[String: Any]])->()) { if let url = URL(string: url) { URLSession.shared.dataTask(with: url) { (data, response, error) in if error == nil { if let data = data { do { let json = try JSONSerialization.jsonObject(with: data, options: []) if let content = json as? [[String: Any]] { // array of dictionaries completion(content) } } catch { // error while decoding JSON print(error.localizedDescription) } } else { print("Error: no data") } } else { // network-related error print(error!.localizedDescription) } }.resume() } } getContent(from: "http://192.1.2.3/PhpProject1/getFullJson.php") { (result) in // 'result' is what was given to 'completion', an array of dictionaries for dataDictionary in result { if let notId = dataDictionary["ID"] as? String { // ... } } }