2016-03-24 5 views
0

Ich bin mir ziemlich sicher, dass dies für die meisten von euch einfach ist, aber ich bin ein Anfänger und ich kann das nicht herausfinden.SWIFT2.0: Funktion kehrt zurück, bevor die Aufgabe abgeschlossen ist

Ich baue eine Funktion zum Parsen einer JSON-Datei online. Diese Funktion sollte nach dem Parsen der Datei einen String zurückgeben, wartet aber nicht auf den Abschluss der Aufgabe vor dem Zurückgeben. Daher habe ich immer einen falschen Wert.

meine Funktion:

func getJsonDataFromPath(path: String) -> String { 

var videoId: String 
videoId = "++ empty ++" 

let url = NSURL(string:path) 
let session = NSURLSession.sharedSession() 
let task = session.dataTaskWithURL(url!) { (data: NSData?, response: NSURLResponse?, error: NSError?) -> Void in 

    if let httpResponse = response as? NSHTTPURLResponse { 
     print("HTTP RESPONSE: \(httpResponse.statusCode)") 
    } // END OF if let httpResponse = response as? NSHTTPURLResponse 

    let json = JSON(data: data!) 

    // print(json) 
    if (json.count > 0) { 
     videoId = json[0]["videoId"].string! 
     print("videoId is: \(videoId)") 
     } 
    } 

task.resume() 

return videoId 

}

und seine Forderung:

override func viewDidLoad() { 
    super.viewDidLoad() 

    let test = getJsonDataFromPath("http://coulon.xyz/JobX/APIs/getListOfJobs.php") 
    print("Value returned by getJsonDataFromPath: \(test)") 
} 

ich immer die Ausgabe in der falschen Reihenfolge erhalten:

Wert von getJsonDataFromPath zurückgegeben: + + leer ++ HTTP-ANTWORT: 200 videoId ist: kzv1NQGdsyk

Wie kann ich sicherstellen, dass task.resume abgeschlossen ist, bevor Sie den Wert zurückgeben?

Vielen viel im Voraus,

Grüße, Julien

+0

nicht zurückkehren Sie , verwenden Sie einen Rückruf ("Completion Handler"). Nur ein Beispiel hier: http://stackoverflow.com/a/35358750/2227743 und es gibt viele andere auf SO. – Moritz

Antwort

1

Sie Swift Verschluss wie das umsetzen sollten:

func getJsonDataFromPath(path: String, completion: (item: String)-> Void){ 

    var videoId: String 
    videoId = "++ empty ++" 

    let url = NSURL(string:path) 
    let session = NSURLSession.sharedSession() 
    let task = session.dataTaskWithURL(url!) { (data: NSData?, response: NSURLResponse?, error: NSError?) -> Void in 

     if let httpResponse = response as? NSHTTPURLResponse { 
     print("HTTP RESPONSE: \(httpResponse.statusCode)") 
     } // END OF if let httpResponse = response as? NSHTTPURLResponse 

     let json = JSON(data: data!) 

     // print(json) 
     if (json.count > 0) { 
     videoId = json[0]["videoId"].string! 
     print("videoId is: \(videoId)") 
     completion(item: videoId) 
     } 
    } 

    task.resume() 


    } 

Und seine Forderung:

override func viewDidLoad() { 
     super.viewDidLoad() 
     getJsonDataFromPath("http://coulon.xyz/JobX/APIs/getListOfJobs.php") { (test) -> Void in 
     print("Value returned by getJsonDataFromPath: \(test)") 
     } 

    } 
+0

Es funktioniert perfekt, und ich verstehe es. Danke vielmals ! – JulienCoo

+0

Dann haben Sie bitte die Antwort gewählt, danke. – iMuzahid

+0

Ich versuche es, aber ich bin ein Neuling und ich habe nicht genug Ansehen. Ich werde zurückkommen und es abstimmen, sobald ich es getan habe. – JulienCoo

Verwandte Themen