2016-03-24 5 views
0

Я уверен, что это легко для большинства из вас, но я новичок, и я не могу понять этого.SWIFT2.0: функция возвращается до завершения задачи

Я создаю функцию для разбора файла JSON в Интернете. Эта функция должна возвращать строку после того, как файл был проанализирован, но он не дожидается завершения задачи перед «возвратом». Поэтому я всегда получаю неправильное значение.

моя функция:

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 

}

и его призыв:

override func viewDidLoad() { 
    super.viewDidLoad() 

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

Я всегда получаю выход в неправильном порядке:

Значение, возвращенное getJsonDataFromPath: + + пусто ++ HTTP RESPONSE: 200 videoId is: kzv1NQGdsyk

Как я могу убедиться, что task.resume завершен, прежде чем возвращать значение?

Спасибо большое заранее,

С уважением, Julien

+0

Не возвращайте , используйте обратный вызов («обработчик завершения»). Просто пример: http://stackoverflow.com/a/35358750/2227743, и есть много других на SO. – Moritz

ответ

1

Вы должны осуществлять Swift закрытия так:

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


    } 

И его призыв:

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

    } 
+0

Он отлично работает, и я понимаю это. Большое спасибо ! – JulienCoo

+0

Тогда пожалуйста, проголосовав за ответ, спасибо. – iMuzahid

+0

Я пытаюсь, но я новичок, и у меня недостаточно репутации. Я вернусь и проголосую, как только у меня получится. – JulienCoo

Смежные вопросы