2016-08-13 14 views
0

このコードでは、生徒の場所を取得するタスクを呼び出す関数があります。タスクの初期化前の行が実行されますが、タスク自体は実行されていないようです。関数の次の行がタスクが完了する前に実行されているように見えます。だから私は2つのことを試しました関数が返される前にタスクの再開が完了しない

  1. 補完ハンドラを追加しても役に立たなかったようです。
  2. task.resume()の後に大きなforループを追加すると、タスクが1つまたは2つのケースで完了したように見えます。しかし、これは正しいことのようには見えません。

これが別のスレッドであるかどうか、誰かがそのスレッドが完了するのを待たせる方法を説明できますか?私はこの仕事をする方法があるかどうか、そしてこれを行うためのよりよい方法があるかどうかを知ることは興味があります。どうもありがとう。

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]

関連する問題