0
之前在下面這段代碼,我有一個調用任務來獲取學生位置的功能。任務初始化之前的行被執行,但任務本身似乎沒有執行。在我看來,即使在任務完成之前,函數中的下一行也會執行。所以我試了兩件事恢復任務沒有完成函數返回
- 添加一個完成處理程序,這似乎沒有幫助。
- 添加一個大的循環後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
}
後右'dataTaskWithRequest'是一個異步操作,當你提交一個任務就立即返回,而在後臺排隊的任務將推動並完成時,則執行完成塊。解析並設置數據源後,需要重新載入表格。 – Khundragpan
也'parsedResult [「results」] as? [String:AnyObject]'是'nil',因爲它不是一本字典。 – Khundragpan