2016-11-10 7 views
0

Alle Tutorials, die ich über Swift 3 JSON Parsing gesehen oder gelesen habe, enthalten JSON Parsing Code innerhalb viewDidLoad() func/Methode und es funktioniert gut. Ich möchte JSON Parsing-Code in einer eigenen Funktion platzieren und es von viewDidLoad() aufrufen. Unten Beispiel:JSON Parsing in seiner eigenen separaten Funktion funktioniert nicht

class ViewController: UIViewController { 
    var ArrayImages = [String](); 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     var json = ParseJson(); 
     print("My Array = \(ArrayImages)"); 

    } 

    // NEW FUNCTION 
    func ParseJson() { 
     let url = URL(string: "http://etasawoq.com/go_categories.php")! 

     URLSession.shared.dataTask(with: url) { (data, response, error) in 
      if (error != nil){ 
       print("Error Found Creating URLSession : \(error)") 
      } else { 
       if let ParsedJson = data { 
        do { 
         let json = try JSONSerialization.jsonObject(with: ParsedJson, options: JSONSerialization.ReadingOptions.mutableContainers) as! NSArray 

         for x in json { 
          let row = x as! NSDictionary; 
          let imageUrl = row["image_url"] as! String 
          self.ArrayImages.append(imageUrl); 
         } 
        } catch { 
         print("Json Processing failed \(error)"); 
        } 
       } 
      } 
     }.resume() // start session 
    } 
} 

Leider ist die „ArrayImages“ nicht aufgefüllt werden, wenn die ParseJson Funktion aufrufen. Die Druckausgabe ist "My Array = []". Warum das? Wie kann ich dieses Problem lösen, während ich den JSON-Parsing-Code in einer separaten Funktion halte?

+0

Ihr 'ParseJson'method ist async Anruf, so wird es im Hintergrund ausgeführt werden, so dass' print ("My Array = \ (ArrayImages)"); 'vor der Fertigstellung Block' dataTask ausgeführt wird (mit:) ' –

+1

Ihr Code würde genau das gleiche Problem haben, selbst wenn es alles in' viewDidLoad' wäre. – rmaddy

+0

Dann, wie kann dieses Problem gelöst werden? image Ich möchte einen tableView mit dem Namen eines Schauspielers füllen. Wie erreiche ich das mit meinem aktuellen Code? – Aboodnet

Antwort

0

Ihre Antwort Block durch, so dass Sie Array in Seite des Blocks nicht außerhalb wie unten drucken müssen.

do { 

         let json = try JSONSerialization.jsonObject(with: ParsedJson, options: JSONSerialization.ReadingOptions.mutableContainers) as! NSArray 

         for x in json { 
          let row = x as! NSDictionary; 
          let imageUrl = row["image_url"] as! String 
          self.ArrayImages.append(imageUrl); 
         } 
         print("My Array = \(ArrayImages)"); 
        } 
+0

Ich habe das vorher versucht und ich weiß, dass es auf diese Weise funktioniert, aber später möchte ich einige Aktionen in ViewDidLoad() durchführen, wie das Aktualisieren einer Beschriftung oder sogar das Füllen einer CollectionView für Bilder. Ihr Weg wird nicht funktionieren, da sobald das Resume() getroffen wird, das Array wieder leer ist. – Aboodnet

+0

ja, aber in jeder Hinsicht sind Sie mit diesem Problem konfrontiert. Aber was willst du tun, nachdem du eine Antwort bekommen hast? – KKRocks

+0

Nehmen wir an, ein TableView mit Schauspielern Namen von JSON URL – Aboodnet