Facebook API - Wie Graph Request abgebrochen wird

8

Ich muss gelegentlich eine FaceBook-Grafikanfrage abbrechen, aber in ihrer API scheint es keine Methode zum Abbrechen oder ähnliches zu geben, um dies zu tun. Im Moment kommt es manchmal zu Abstürzen, da der Delegat, den ich der Anfrage zugewiesen habe, freigegeben wurde. Gibt es eine Möglichkeit, eine Grafikanfrage zu stornieren, sobald sie gesendet wurde?

    
CastToInteger 10.02.2011, 15:18
quelle

9 Antworten

10

Ich gehe davon aus, dass Sie über das Projekt facebook-ios-sdk sprechen und über das Fehlen einer Abbruchmethode in Facebook.h. Ich bemerkte dies auch und entschied mich schließlich, meine eigene Stornierungsmethode hinzuzufügen. Beachten Sie, dass der Delegat, den Sie der Anforderung zuweisen, nicht freigegeben und dann referenziert werden soll, da die Anforderung den Delegaten enthält. Siehe diese ähnliche Frage . Jetzt, wenn Sie wirklich eine Abbruchmethode aus einem anderen Grund brauchen ...

Hinzufügen einer Abbruchmethode:
Facebook-Anfragen werden in einer undurchsichtigen Weise gemacht. Sie sehen sie nie und hören nur über die Facebook -Klasse von Ergebnissen. Unter der Haube macht die Klasse Facebook Graph-API-Anfragen mit der Klasse FBRequest (nicht für öffentliche Verwendung). Diese Klasse ist im Grunde ein schicker NSURLConnection Delegierter. Um also die Anfrage abzubrechen, muss dem Mitglied NSURLConnection nur noch cancel mitgeteilt werden. Hinzufügen dieser Methode zu FBRequest:

%Vor%

Und ...

%Vor%

Nun, um eine Schnittstelle in der Facebook-Klasse verfügbar zu machen, um die neue Methode zu verwenden ...

%Vor%

Und ...

%Vor%

Das ist alles, was dazu gehört. Die obige Methode löscht die letzte Anfrage und Sie werden nie wieder davon hören.

    
Matt Wilding 15.02.2011, 19:27
quelle
4

Ich habe den hier aufgeführten Ansatz von Matt Wilding verfolgt, der sehr nützlich war, danke Matt. Leider hat es für mich nicht funktioniert, also habe ich ein paar Verbesserungen vorgenommen und jetzt funktioniert es ... auch dieser überarbeitete Ansatz hält sich von den Kern-Klassen von Facebook fern ...

%Vor%     
staticfiction 25.11.2011 06:18
quelle
4

Aktualisiert am 22. April 2012

Ich aktualisiere Matts Version mit dem aktuellsten Facebook iOS SDK. Mein Projekt verwendet ARC, aber ich schließe die Nicht-ARC-Facebook-Quellen ein, damit ich die Codes ändern kann. (Natürlich müssen wir das Flag "-fno-objc-arc" für Facebook-Quelldateien setzen). Der schwierigste Teil ist, den Speicherverlust zu verhindern, und ich denke, dass ich es richtig mache. Aber wenn ich es im Instrument teste, sehe ich immer noch sehr wenig Speicherleck. Glücklicherweise zeigen die Details, dass sie nicht mit diesen Codes zusammenhängen, also nehme ich an, dass sie mit der App-Ressourcenbehandlung zusammenhängen.

Hier ist der Code, den ich implementiert habe:

%Vor%

Und ...

%Vor%

Und in Ihrem Projekt, das FBRequestDelegate verwendet

%Vor%

Und ...

%Vor%     
Wayne Liu 21.04.2012 17:16
quelle
2

Für diejenigen unter uns, die die statische Bibliothek erstellen und nicht auf die Implementierungsdateien zugreifen können, wäre eine Kategorie der beste Weg.

Für diejenigen unter uns, die die statische Bibliothek nicht erstellt haben, wäre die Verwendung einer Kategorie ebenfalls optimal, da Sie die vorhandenen Dateien nicht ändern müssen.

Hier ist die Kategorie.

%Vor%

Und dann die .m-Datei

%Vor%

Wenn Sie eine andere Antwort verwenden, verursachen Sie einen Speicherverlust. Das Facebook SDK warnt Sie durch NSLog, dass Sie keinen Beobachter entfernt haben. Die vierte Zeile in der CancelAllRequests-Methode behebt dieses Problem.

    
Nate Symer 15.08.2012 17:07
quelle
1

Versuchen Sie dies anstelle von NSTimer:

%Vor%     
ozz 29.06.2012 07:06
quelle
1

Seit SDK 3.1 ist es sehr einfach, startWithCompletionHandler: gibt a zurück FBRequestConnection Objekt, das eine -(void)cancel; Methode hat.

Zum Beispiel:

%Vor%     
Tal Yaniv 01.01.2013 06:00
quelle
0

In FBRequest.h musste ich add _delegate = nil; haben, weil in meinem Fall der Anforderungsdelegat nicht mehr existierte (es wurde entlassen), was einen Absturz verursachte.

    
anony 21.09.2011 04:31
quelle
0

Ich hatte einen Absturz mit dem vorherigen iOS Facebook SDK, das im August 2012 gültig war, wenn ich zu einer anderen Ansicht navigierte. Meine Lösung basiert auf @staticfiction Antwort:

Hinzugefügt BOOL viewWillDisappear Flag in .h. In -(void) viewWillDisappear: setze das Flag auf YES. Setzen Sie das Flag auf NO in -(void) viewDidAppear:

zurück %Vor%     
jaminyah 16.12.2012 02:01
quelle
-2

Machen Sie einen CURL-Aufruf an diese URL

%Vor%     
mjs 21.09.2011 04:40
quelle