2016-08-13 23 views
0

之前在下面這段代碼,我有一個調用任務來獲取學生位置的功能。任務初始化之前的行被執行,但任務本身似乎沒有執行。在我看來,即使在任務完成之前,函數中的下一行也會執行。所以我試了兩件事恢復任務沒有完成函數返回

  1. 添加一個完成處理程序,這似乎沒有幫助。
  2. 添加一個大的循環後task.resume(),它看起來像的任務是在一個或兩個例完全。但這看起來並不是正確的做法。

有人可以解釋,如果這是另一個線程,以及如何使函數等待該線程完成?我很想知道是否有辦法做到這一點,以及是否有更好的方法來做到這一點。非常感謝。

func getStudentLocation(completionHandler: (studentDictionary: NSDictionary) ->()) { 

    let request = NSMutableURLRequest(URL: NSURL(string: "https://parse.udacity.com/parse/classes/StudentLocation")!) 
    request.addValue("QrX47CA9cyuGewLdsL7o5Eb8iug6Em8ye0dnAbIr", forHTTPHeaderField: "X-Parse-Application-Id") 
    request.addValue("QuWThTdiRmTux3YaDseUSEpUKo7aBYM737yKd4gY", forHTTPHeaderField: "X-Parse-REST-API-Key") 
    let session = NSURLSession.sharedSession() 
    print("starting task") 
    let task = session.dataTaskWithRequest(request) { (data, response, error) in 
     print("getStudentLocation in task: \(error) \(response)") 
     if error != nil { // Handle error... 
      print(" error in get student location: \(error)") 
      return    
     } 

     let parsedResult: AnyObject 
     do { 
      parsedResult = try NSJSONSerialization.JSONObjectWithData(data!, options: .AllowFragments) 
     } 
     catch { 
      return 
     } 
     self.studentDictionary = parsedResult["results"] as? [String: AnyObject] 
     // completionHandler(studentDictionary: self.studentDictionary!)  
     print("STudent Dictonary: \(self.studentDictionary)") 
    } 

    task.resume() 
} 
override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
    getStudentLocation{ 
     studentDictionary in 
     //studentDictionary.count 
     print("Count: \(studentDictionary.count)") 
    } 
    return studentDictionary!.count 
} 
+0

後右'dataTaskWithRequest'是一個異步操作,當你提交一個任務就立即返回,而在後臺排隊的任務將推動並完成時,則執行完成塊。解析並設置數據源後,需要重新載入表格。 – Khundragpan

+0

也'parsedResult [「results」] as? [String:AnyObject]'是'nil',因爲它不是一本字典。 – Khundragpan

回答

0

dataTaskWithRequest()在後臺運行。這就是爲什麼你的函數在task.resume()之後立即返回。

要顯示您下載的數據tableView,您必須在task的完成處理程序結束時重新加載其數據。 self.studentDictionary = parsedResult["results"] as? [String: AnyObject]