이 코드에서는 학생 위치를 가져 오는 작업을 호출하는 함수가 있습니다. 작업 초기화 전의 행은 실행되지만 작업 자체는 실행되지 않는 것처럼 보입니다. 함수의 다음 줄이 작업이 완료되기 전에 실행되는 것처럼 보입니다. 그래서 두 가지를 시도했습니다함수가 반환되기 전에 작업 재개가 완료되지 않습니다.
- 완료 처리기를 추가해도 도움이되지 않았던 것 같습니다.
- task.resume() 다음에 큰 for 루프를 추가하면 하나 또는 두 가지 경우에 완료된 것처럼 보입니다. 그러나 이것은 옳은 일처럼 보이지 않습니다.
누군가 다른 사람이 설명해 주며, 해당 스레드가 완료 될 때까지 함수를 대기시키는 방법을 설명해 줄 수 있습니까? 이 작업을 할 수있는 방법이 있는지 그리고이 작업을 수행 할 수있는 더 좋은 방법이 있는지 궁금 할 것입니다. 고마워.
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