6

Ich arbeite mit dem IOS Facebook SDK 3, und ich versuche, es mit dem effizienteren Ansatz zu verwenden. Also möchte ich einige Anfragen in separaten Threads verwalten.Async FB Anfrage mit Block in getrennten Thread Ausgabe

Zum Beispiel dieser Anfrage (funktioniert einwandfrei):

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0); 
dispatch_async(queue, ^{ 

    [self generateShareContentFor:ShareServiceTypeFacebook 
         callback:^(NSMutableDictionary* obj) 
    { 
     FBRequest * rq = [FBRequest requestWithGraphPath:@"me/feed" 
               parameters:obj 
               HTTPMethod:@"POST"]; 
     [rq startWithCompletionHandler:^(FBRequestConnection *connection, id result, NSError *error) { 

       dispatch_async(dispatch_get_main_queue(), ^{ 
       // TREATING RESULT 
       [[UFBManager defaultManager] errorHandlerFromError:error 
                 fromRqType:UFBManagerRqTypePost]; 
       }); 

      }]; 
    }]; 

}); 
  • ich dies bin mit etwas auf meinem Feed zu veröffentlichen, rufe ich eine Methode, den Inhalt dieser Anfrage automatisch geladen und dann wird dieser Block in der Methode aufgerufen, um die Anfrage zu starten. Dieser funktioniert gut.

  • Das Problem ist, wenn ich diese Anfrage nicht in einen Block setzen, funktioniert das nicht.

Diese Anfrage funktioniert nicht

 dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0); 
    dispatch_async(queue, ^{ 

      FBRequest * rq = [FBRequest requestForMe]; 
      [rq startWithCompletionHandler:^(FBRequestConnection *connection, id result, NSError *error) { 

        dispatch_async(dispatch_get_main_queue(), ^{ 

        // TREATING RESULT 
        [[UFBManager defaultManager] errorHandlerFromError:error 
                  fromRqType:UFBManagerRqTypeGet]; 

        }); 

      }]; 
    }); 

Ich versuche, herauszufinden, aber ich verstehe nicht, was das Problem ist. Vielen Dank im Voraus für Ihre Hilfe.

+0

Sie müssen einige weitere Informationen bereitstellen. Was meinst du mit "geht nicht"? –

+0

Danke für deine Antwort Christopher, und Entschuldigung für den Mangel an Informationen. Wenn ich versuche, diese zweite Anfrage zu debuggen, kann ich bis zur * rq -Deklaration loggen, aber ich habe keine Rückkehr von dem Block der Vervollständigung-Handler beim Start der startCompletionHandler-Methode –

Antwort

2

Ich bin nicht davon überzeugt, warum es in einem Fall und nicht der andere funktioniert, aber ich denke, es hat mit der Laufschleife für Ihre Hintergrundwarteschlange nicht ausgeführt, nachdem startWithCompletionHandler: zurückkehrt.

Aber ich frage mich, warum Sie das auf eine Hintergrundwarteschlange sowieso setzen, da es ein asynchroner Anruf ist. Warum nicht einfach aus dem Hauptthread:

FBRequest * rq = [FBRequest requestForMe]; 
[rq startWithCompletionHandler:^(FBRequestConnection *connection, id result, NSError *error) { 
     dispatch_async(dispatch_get_main_queue(), ^{ 
     [[UFBManager defaultManager] errorHandlerFromError:error 
               fromRqType:UFBManagerRqTypeGet]; 
     }); 
}]; 
+0

Das Problem in meinem Fall ist, dass der Haupt-Thread ist bereits von anderen Dingen besetzt und mein Ziel ist es, die Liste Ihres Facebook-Freundes in einem anderen Thread zu laden, um das Haupt nicht schwerer zu belasten –

+0

Ich sehe, es sieht aus wie 'FBURLConnection' läuft nur eine NSURLConnection auf dem Thread war es aufgerufen von. Ich hätte gedacht, dass es die Netzwerkverbindung auf einem Hintergrundthread laufen lassen würde. Andernfalls, warum eine asynchrone API verfügbar machen? –

+0

Ja das ist wahr, ich habe nicht darüber nachgedacht und es scheint logisch, also was ich tun soll, ist zum Beispiel meine Liste von 5000 Freunden in einem zweiten Thread zu behandeln. Da dieser Callback: 'startWithCompletionHandler:' in der Hauptwarteschlange ausgeführt wird, wird die Listenbehandlung von dieser Hauptwarteschlange aus ausgeführt. Habe ich eine korrekte Vorgehensweise? –

6

Ich hatte dieses Problem für ein bisschen.

Stellen Sie sicher, dass Sie den Code auf dem Hauptthread versenden.

dispatch_async(dispatch_get_main_queue, ^{ 

      FBRequest * rq = [FBRequest requestForMe]; 
      [rq startWithCompletionHandler:^(FBRequestConnection *connection, id result, NSError *error) { 
        //The docs say this will be the main queue here anyway 
        //Feel free to go on a background thread at this point 
        }]; 

     }); 
Verwandte Themen