2016-03-24 17 views
0

Eminim ki bu çoğu için kolay, ama yeni başlayan biri ve bunu anlayamıyorum.SWIFT2.0: görev tamamlanmadan önce işlev döndürür

Çevrimiçi JSON dosyasını ayrıştırmak için bir işlev yapıyorum. Dosya ayrıştırıldıktan sonra bu işlev bir Dize döndürmelidir, ancak görevin "geri dönüş" den önce tamamlanmasını beklemez. Bu nedenle, her zaman yanlış bir değerle sonuçlanırım.

benim işlevi:

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 

}

ve çağrı:

override func viewDidLoad() { 
    super.viewDidLoad() 

    let test = getJsonDataFromPath("http://coulon.xyz/JobX/APIs/getListOfJobs.php") 
    print("Value returned by getJsonDataFromPath: \(test)") 
} 
Hep yanlış sırada çıktı almak

: getJsonDataFromPath tarafından döndürülen

Değer: + + boş ++ HTTP SORUN: 200 videoId: kzv1NQGdsyk

Değer döndürmeden önce task.resume öğesinin tamamlandığından nasıl emin olabilirim?

önceden

Saygılarımızla, Julien Çok teşekkür ederim

Böyle Swift kapanmasını uygulamalıdır
+0

iade etmeyin , bir geri arama kullanın ("tamamlama işleyici"). Burada sadece bir örnek: http://stackoverflow.com/a/35358750/2227743 ve SO üzerinde birçok başkaları var. – Moritz

cevap

1

:

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() 


    } 

Ve çağrı:

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

    } 
+0

Mükemmel çalışıyor ve anlıyorum. Çok teşekkürler ! – JulienCoo

+0

Öyleyse lütfen cevabı oylayın, teşekkürler. – iMuzahid

+0

Deniyorum ama ben bir acemi ve yeterince itibarım yok. Geri gelip elime geçer geçmez oy vereceğim. – JulienCoo

İlgili konular