2016-09-28 3 views
0

Ich versuche mit dispatch_group_notify eine HTTP-Anfrage zu senden, wo ich auf das Ergebnis dieses Befehls warten muss, bevor ich meine Verarbeitung fortsetze.schnelle asynchrone Anfrage mit dispatch_group_notify funktioniert nicht

hier ist der folgende Aufruf:

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

     } 

     } 
    } 

und hier ist die Funktion, die den HTTP-Befehl sendet:

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) 

} 

Ich möchte diese Funktion, um sicherzustellen, speichern beendet ist (dispatch_group_leave) vor Öffnen des neuen ViewControllers (CarnetTableViewController), aber ich kann sehen, dass ViewController vor dem Ende der Dispatch-Gruppe ...

aufgerufen wird, wie kann ich en sicher das Ende der Speicherfunktion vor dem Öffnen der neuen Ansicht?

Antwort

1

Die letzten drei Zeilen Ihrer Funktion:

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

Dies bewirkt, dass die Aufgabe zu starten, und dann Sie sofort (vor der Aufgabe abgeschlossen hat), die Gruppe verlassen und die callback nennen.

Wenn Sie den Code verfolgen, treten Ihre dispatch_group_enter und dispatch_group_leave im selben Bereich, in der gleichen Warteschlange und vor dem Aufruf callback(). Das bedeutet, dass sie eigentlich gar nichts machen. Zu dem Zeitpunkt, zu dem Sie zu Ihrem Rückruf gelangen, ist die Gruppe dispatch_group leer.

Wenn Sie einen Fehler hatten, würde ich ein Problem erwarten, wenn diese Fehlermeldung ein zweites Mal dispatch_group_leave aufruft (da dies unausgewogen ist).

Sie bedeutete dies:

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

task.resume() 
Verwandte Themen