2016-09-28 15 views
0

処理を続行する前に、dispatch_group_notifyを使用してこのコマンドの結果を待つ必要のあるHTTP要求を送信しようとしています。ここdispatch_group_notifyを使用した迅速な非同期要求が機能しない

は、次の呼び出しです:

self.save(){(response) in 
    if let result = response as? Bool { 
     if(result == true){ 
      dispatch_group_notify(self.myGroup!, dispatch_get_main_queue(), { 
       print("send carnet finished") 
       let registrationView = UIStoryboard(name: "Main", bundle: nil).instantiateViewControllerWithIdentifier("carnetTable") as! CarnetTableViewController 
       self.navigationController?.pushViewController(registrationView, animated: true) 
      }) 

     } 

     } 
    } 

、ここでは、HTTPコマンドを送信している機能です。

func save(callback: (AnyObject) ->()){ 
    dispatch_group_enter(self.myGroup) 

    let p = pickerDataSource[patients.selectedRowInComponent(0)] 

    let params = "owner=\(User.sharedInstance.email)&patient=\(p)&carnet=\(commentaires.text!)" 

    let final_url = url_to_request + "?" + params.stringByAddingPercentEncodingForISOLatin1()! 
    print("URL addCarnet: \(final_url)") 

    let url:NSURL = NSURL(string: final_url)! 

    //let session = NSURLSession.sharedSession() 
    let configuration = NSURLSessionConfiguration.defaultSessionConfiguration() 
    let session = NSURLSession(configuration: configuration, 
           delegate: self, 
           delegateQueue:NSOperationQueue.mainQueue()) 

    let request = NSMutableURLRequest(URL: url) 
    request.HTTPMethod = "GET" 
    request.cachePolicy = NSURLRequestCachePolicy.ReloadIgnoringCacheData 
    request.timeoutInterval = 10 


    let task = session.dataTaskWithRequest(request) { 
     (
     let data, let response, let error) in 
     guard let _:NSData = data, let _:NSURLResponse = response where error == nil else { 
      print("error data") 
      dispatch_group_leave(self.myGroup) 
      callback(false) 
      return 
     } 
     var result = NSString(data: data!, encoding:NSASCIIStringEncoding)! 
     print("result: \(result)") 
    } 

    task.resume() 
    dispatch_group_leave(self.myGroup) 
    callback(true) 

} 

私はそのセーブ機能が前に(dispatch_group_leave)を終了することを確認したいと思います新しいViewController(CarnetTableViewController)を開きますが、ViewControllerがdispatch_groupの最後の前に呼び出されていることがわかります...

どのようにすることができますか新しいビューを開く前に保存機能の終了を確認しますか?あなたの関数の

答えて

1

最後の3行:

task.resume() 
dispatch_group_leave(self.myGroup) 
callback(true) 

これは、タスクが開始させ、その後、あなたは(タスクが完了する前に)すぐに、グループを離れ、callbackを呼び出します。

コードをトレースすると、dispatch_group_enterdispatch_group_leaveは、同じキュー内の同じスコープ内で、callback()にコールする前に発生します。つまり、実際に何もしていないということです。あなたがコールバックに行く時までに、dispatch_groupは空です。

エラーが発生した場合、そのエラーレッグがdispatch_group_leave(これはアンバランスなので)にもう一度呼び出すと問題が発生すると思います。

... 
    var result = NSString(data: data!, encoding:NSASCIIStringEncoding)! 
    print("result: \(result)") 
    dispatch_group_leave(self.myGroup) 
    callback(true) 
} 

task.resume() 

あなたはこのことを意味し

関連する問題