簡體   English   中英

SWIFT2.0:函數在任務完成之前返回

[英]SWIFT2.0: function returns before task is completed

我敢肯定,對大多數人來說這很容易,但是我是一個初學者,我無法弄清楚這一點。

我建立了一個在線解析JSON文件的功能。 解析完文件后,該函數應返回String,但是它不等待任務完成才返回。 因此,我總是以錯誤的值結尾。

我的功能:

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響應:200 videoId為:kzv1NQGdsyk

如何在返回值之前確保task.resume已完成?

在此先多謝

問候,朱利安

您應該像這樣實現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)")
      }

    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM