2016-08-13 3 views
0

이 코드에서는 학생 위치를 가져 오는 작업을 호출하는 함수가 있습니다. 작업 초기화 전의 행은 실행되지만 작업 자체는 실행되지 않는 것처럼 보입니다. 함수의 다음 줄이 작업이 완료되기 전에 실행되는 것처럼 보입니다. 그래서 두 가지를 시도했습니다함수가 반환되기 전에 작업 재개가 완료되지 않습니다.

  1. 완료 처리기를 추가해도 도움이되지 않았던 것 같습니다.
  2. 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 
} 
+0

'dataTaskWithRequest'는 비동기 작업입니다. 작업을 제출하면 즉시 백그라운드 대기열에있는 동안 작업이 진행되고 완료되면 완료 블록이 실행됩니다. 구문 분석 및 데이터 소스 설정 후에 테이블을 다시로드해야합니다. – Khundragpan

+0

또한'parsedResult [ "results"] as? [String : AnyObject]'는 사전이 아니므로'nil'입니다. – Khundragpan

답변

0

dataTaskWithRequest()은 백그라운드에서 실행됩니다. 그래서 task.resume() 직후 함수가 반환됩니다.

tableView에 다운로드 한 데이터를 표시하려면 task 완료 핸들러의 끝에 데이터를 다시로드해야합니다. 오른쪽 후 self.studentDictionary = parsedResult["results"] as? [String: AnyObject]

관련 문제