Array Avec JSON
Bonjour,
j'ai un petit soucis avec mes variable et array etc...
Je n'arrive pas a sortir de mes fonctions.
enfin je ne sais pas si je me fait comprendre, mais lorsque je récupère mes infos vis JSON j'arrive a les afficher que dans la fonction.
je voudrais créer des array que je peux appeler n'importe ou dans mon controler.
Par exemple, reutiliser l'Array en question pour peublé une tableView ou m'en servire pour un quiz etc....
une idée svp ?
func getDataFromJson(){
let requestURL: NSURL = NSURL(string: "http://www.monsite.com/APP/SupportFile/IPoomsae/Kibon/kibon.JSON")!
let urlRequest: NSMutableURLRequest = NSMutableURLRequest(url: requestURL as URL)
let session = URLSession.shared
let task = session.dataTask(with: urlRequest as URLRequest) {
(data, response, error) -> Void in
let httpResponse = response as! HTTPURLResponse
let statusCode = httpResponse.statusCode
if (statusCode == 200) {
print("Everyone is fine, file downloaded successfully.")
do{
let responseString = try JSONSerialization.jsonObject(with: data!, options:.allowFragments) as! NSDictionary
//Definition
if let kibon = responseString["kibon"] as? [[String: AnyObject]] {
for item in kibon {
//let KibonContent = KibonCustumClass()
if let newItem1 = item["definitionHead"]?["definition"] as? String {
//Definition Array
self.definitionContentArray.append(newItem1)
print("HEUY", self.definitionContentArray)
}
}
}
}catch {
print("Error with Json: \(error)")
}
}
}
task.resume()
}
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
C'est toujours la même erreur (ce qui veut dire que tu trouveras beaucoup de réponses à ton problème sur le web, doit sûrement en avoir quelques unes sur ce forums).
Le concept qui t'échappe, c'est le côté asynchrone.
Par exemple, si tu mets un print() après task.resume(), il apparaà®tra dans ta console avant print("Everyone is...).
Il faut comprendre qu'un appel réseau, bah ça prend du temps. Et tu aimerais faire autre chose pendant ce temps-là (setter d'autres variables, etc.), du coup, l'appel est fait en background, et tu peux continuer. Si ce n'était pas le cas, tu bloquerais le thread courant, et tant que ce n'est pas fini, pas possible d'aller à la ligne suivante. Imagine ça si t'as un réseau pourri, tu pourrais rester bloquer de nombreuses secondes.
Il y a diverses solutions pour dire qu'à la fin du traitement, tu as terminé et et que tu peux utiliser les infos.
Le plus simple et le plus élégant, c'est d'utiliser une closure (block en Objective-C).
De la même manière que tu utilises { (data, response, error) -> Void in, tu rajoutes une closure (souvent appelés completionHandler, successBlock, errorBlock) de ce genre à getDataFromJson().
Ne parlant pas Swift, je vais avoir du mal à te sortir une closure qui compile et qui fonctionne directement.
Mais si tu veux faire tes recherches de ton côté les mots clés sont "closure + asynchrone + Swift".
Merci beaucoup. Je vais voir dans ce sens peut être vais effectivement trouvé quelques choses.
Merci encore