2017-06-03 4 views
0

Ich rufe die Facebook Graph API an, um die E-Mail, die Facebook ID und den Namen eines Benutzers zu erhalten, der sich über Facebook bei meiner App anmeldet.Versandwarteschlangen für asynchronen Webdienst Anruf

Ich bekomme die Informationen erfolgreich; Ich versuche jetzt, Dispatch-Gruppen zu verwenden, also die Funktion, die der Aufruf-Graph wartet, bis der Graph-API-Aufruf abgeschlossen ist, bevor er zurückkehrt. Die Grafikanforderung ist asynchron.

Ich kann nicht herausfinden, warum dieser Code blockiert.

1) Erstellen Sie eine Versandgruppe

2) Geben Sie die Anzeigegruppe

3) Lassen Sie die Gruppe einmal Informationen abgerufen wird oder ein Fehler gefunden wird

4) Warten Sie auf die Gruppe verlassen vor Zurückgeben

Es scheint wie meine Versandgruppe eingeben wird nicht korrekt aufgerufen, aber ich kann nicht herausfinden, warum.

class func getFBInformation()->Bool { 
    var fbResult = false 

    let fbGraphGroup = DispatchGroup() 

    fbGraphGroup.enter() 

    FBSDKGraphRequest(graphPath: "/me", parameters: ["fields": "id, name, email"]).start { (connection, result, err) in 
     if err != nil { 
      fbResult = false 
      print("Pre Error Signal") 
      fbGraphGroup.leave() 
      return 
     } 

     if let resultDict = result as? [String:AnyObject] { 
      <Do things with graph results> 

      print("Pre success signal") 
      fbResult = true 
      fbGraphGroup.leave() 
     } 
    } 

    fbGraphGroup.wait() 
    print("Post signal") 

    return fbResult 
} 

Antwort

1

Wie könnte es funktionieren? Zuerst geben Sie die Gruppe ein, als Nächstes warten Sie auf den Hauptthread für den Abschluss-Handler, bis er die Gruppe verlässt. Der Completion-Handler kann jedoch nicht auf dem Haupt-Thread ausgeführt werden, um die Gruppe verlassen zu können.

Soweit ich weiß, wird Ihr Abschluss-Handler in der Hauptwarteschlange von der API ausgelöst. Es ist nicht notwendig, irgendeine andere Art von Synchronisation zu verwenden.

Verwandte Themen