4 Stimmen

Problem mit dem Facebook-Anfrage-Thread

In Ordnung, ich bin ein wenig neu in Threads, so habe ich diese Frage. Ich versuche, Informationen von Freunden von Facebook zu erhalten, und ich möchte nicht, dass auf dem Haupt-Thread zu tun. aber aus irgendeinem Grund, wenn die Anforderung nicht auf dem Haupt-Thread der Callback nie aufgerufen wird und ich weiß nicht, warum!

Ich habe ein Array mit allen IDs von meinen Freunden und Schleife durch dieses Array und erstellen Sie ein Objekt meiner benutzerdefinierten Klasse Friend (die alle Informationen, die ich brauche) mit jeder ID. Ich füge dieses Objekt zu einem Array hinzu. Dieses Friend-Objekt stellt eine Anfrage an Facebook und verarbeitet die Antwort, um die gewünschten Daten zu erhalten.

Hier ist der Code:

dispatch_async(dispatch_get_global_queue(0, 0), ^(void) {
            [self getFBFriendsInfo];
        }); 

 -(void)getFBFriendsInfo{

if (friendsInfoArray) {
    [friendsInfoArray removeAllObjects];
}
else{
    friendsInfoArray =[[NSMutableArray alloc]init];
}

for (int i=0; i<[UDID count]; i++) {
    NSString *udid = [UDID objectAtIndex:i];
    FriendsInfo *friend =[[FriendsInfo alloc] initWithFacebook:facebook andUdid:udid];
    [friendsInfoArray addObject:friend];
    [friend release];

}

dispatch_async(dispatch_get_main_queue(), ^(void) {
    [delegate friendsInfosAvailable:friendsInfoArray];
});

}

und in meiner benutzerdefinierten Klasse tue ich dies:

[facebook requestWithGraphPath:udid andDelegate:self];

Damit werden die Callbacks nie aufgerufen! Nur wenn ich die Anfrage auf dem Hauptthread ausführe, funktioniert es:

dispatch_async(dispatch_get_main_queue(), ^(void) {
    [facebook requestWithGraphPath:udid andDelegate:self];

});

9voto

Lio Punkte 4130

Aus diesem Grund erhalten Sie in einem anderen Thread keine Antwort:

Facebook wird NSURLConnection verwenden, um Anfragen zu bearbeiten. Damit die Verbindung korrekt funktioniert, muss die Laufzeitschleife des aufrufenden Threads im Standard-Laufschleifenmodus arbeiten (siehe NSURLConnection-Klassenreferenz). Wenn Sie dispatch_async() verwenden, gibt es keinen Run-Loop, der im Standard-Run-Loop-Modus arbeitet (es sei denn, Sie befinden sich in der Haupt-Dispatch-Warteschlange, laufen also im Haupt-Thread). Daher gehe ich davon aus, dass die Anfrage nicht einmal gesendet wird (Sie können das überprüfen, indem Sie Ihr Netzwerk ausspähen, wenn Sie möchten).

Kurz gesagt, Sie sollten Ihre Anfrage im Hauptthread stellen; da sie asynchron ist, wird sie Ihre Anwendung nicht einfrieren. Wenn die Verarbeitung der Antwort dann zu aufwendig ist, sollten Sie sie im Hintergrund verarbeiten.

Ich hoffe wirklich, dass dies hilft.

Mein Bestes.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X