2016-09-28 42 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結束之前調用...

我該怎麼做確保在打開新的View之前保存功能的結束?

回答

1

最後三行的功能:

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()