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?
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:
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.
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%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%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.
Seit SDK 3.1 ist es sehr einfach, startWithCompletionHandler: gibt a zurück FBRequestConnection Objekt, das eine -(void)cancel;
Methode hat.
Zum Beispiel:
%Vor%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:
Tags und Links ios facebook facebook-graph-api facebook-ios-sdk