iOS-block mit return-Wert
Ich bin mit einem block von Facebook SDK. Es gibt ein Wörterbuch. Ich will das dictionary als Rückgabewert einer Methode. Ich bin versucht, wickeln Sie meinen Kopf herum, die ganze block-Konzept, brauchen aber einen Schubs in die richtige Richtung.
Den block:
(das argument für den block ist ein string userFBid)
-(NSDictionary*) getMutualFBFriendsWithFBid:(NSString*)fbID {
[FBRequestConnection startWithGraphPath:[NSString stringWithFormat:@"/%@/mutualfriends/%@", [[PFUser currentUser] objectForKey:kFbID],userFBid]
parameters:nil
HTTPMethod:@"GET"
completionHandler:^(
FBRequestConnection *connection,
id result,
NSError *error
) {
result = (NSDictionary*)result;
//return result;
}];
}
Wie komme ich an den Rückgabewert?
Habe ich versucht zu google, aber ich kann nicht meine hand um ihn herum.
Ich würde schätzen, dass alle Zeiger in die richtige Richtung.
EDIT:
Die wichtigste Frage ist folgende: ich muss die Abschluss-handler-Aufruf einer Methode in eine andere Klasse... wie geht das?
Anfragen async, so sollten Sie Prozess "Ergebnis" - Wörterbuch, blockieren oder erstellen Sie eine zusätzliche Methode, und rufen Sie es mit der resultierenden dictionary als argument.
Ich bin mit dem gleichen "Ergebnis" in verschiedenen Klassen, so würde ich eher in der Lage sein es zu nennen und das Ergebnis in den verschiedenen Klassen. Tryin, um herauszufinden, wie.
Sie speichern könnte die
yup sowas ja. Siehe edit oben. Ich habe zu dieser Methode in eine Singleton-Klasse, und verwenden Sie das Ergebnis in einer anderen Klasse. So sind Sie in etwas, nur versuchen, herauszufinden, wie Sie tatsächlich tun. Ich kann mir nicht vorstellen, ich einfach weisen Sie eine öffentliche Eigenschaft, um die Singleton-Klasse und Holen, Wann immer ich es brauche, dann wird der block aufgerufen wird?
Ich verstehe es nicht: warum wollen Sie anrufen möchten
Ich bin mit dem gleichen "Ergebnis" in verschiedenen Klassen, so würde ich eher in der Lage sein es zu nennen und das Ergebnis in den verschiedenen Klassen. Tryin, um herauszufinden, wie.
Sie speichern könnte die
result
in Ihre eigene öffentliche Instanzvariablen zugreifen, die innerhalb Ihrer andere Klassen. Ist es das, was Sie wollen?yup sowas ja. Siehe edit oben. Ich habe zu dieser Methode in eine Singleton-Klasse, und verwenden Sie das Ergebnis in einer anderen Klasse. So sind Sie in etwas, nur versuchen, herauszufinden, wie Sie tatsächlich tun. Ich kann mir nicht vorstellen, ich einfach weisen Sie eine öffentliche Eigenschaft, um die Singleton-Klasse und Holen, Wann immer ich es brauche, dann wird der block aufgerufen wird?
Ich verstehe es nicht: warum wollen Sie anrufen möchten
completionHandler
's block anderswo?
InformationsquelleAutor B-Man | 2014-04-05
Du musst angemeldet sein, um einen Kommentar abzugeben.
Als die Methode
startWithGraphPath
asynchron ist, Sie nicht Programmieren kann, als wenn es synchron : es bedeutet keinen Rückgabewert, weil, sobald diese Methode aufgerufen wird, Ihre app wird weiterhin ausgeführt, um die nächste Zeile, und nicht warten, bis ein Rückgabewert.So, halten diese async, ich nehme an, Sie möchten verwenden Sie das Ergebnis dieser in eine eigene Funktion, so nennen Sie es in Ihrem
completionHandler
block:Bearbeiten
OK, ich bekomme es. Ändern Sie Ihre Methode akzeptiert eine callback als parameter :
Dann in Ihre andere Klasse, verwenden Sie einen anderen block zu behandeln Ergebnis :
Hinweis : Sie sollten behandeln der Fehler vor dem auslösen der Rückruf.
Edit 2 (Hilfe von anderen Anwendern geschätzt)
Sogar besser, könnte man versuchen, geben Sie eine callback-Einnahme alle Parameter (nicht getestet und nicht sicher mit der syntax. Wenn jemand kann mich korrigieren, würde ich schätzen):
Hier ist eine Referenz auf den Apple-docs für ein tieferes Verständnis.
Genau.... werde versuchen es umzusetzen!
Sie könnten versuchen mit meinem zweiten Vorschlag? Ich bin mir nicht sicher, aber es könnte besser sein für Sie
der erste edit ist eigentlich perfekt funktioniert... der zweite wird sagen, es fehlt die 3 Argumente in der Rückruf nach "Abschluss-handler". im Versuch, mit ihm zu spielen
Versuchen
callback(FBRequestConnection *connection,id result,NSError *error)
InformationsquelleAutor Bigood
Du schon haben 🙂
Ich würde schreiben Sie eine Methode, Prozess Wörterbuch, in Ordnung zu halten, die completionHandler-block ein wenig sauberer-aber Sie könnten schreiben Sie Ihre Antwort-handling-code, der in den block. Wie ein anderer Kommentator erwähnt, ist dies async-Sie sind also nicht wirklich "die Rückkehr" nichts...du bist Umgang mit der Fertigstellung blockieren, wenn es aufgerufen wird.
Helfen Sie verstehen ein wenig, der completionHandler-block ist in diesem Fall ein Stück code, dass Sie vorbei sind, die der Methode als argument dafür zu nennen, später. Im wesentlichen, "wenn dieser Anruf kommt zurück, dazu: ^{ ". Die Umsetzung der FBRequest Methode rufen Sie Ihren completionHandler (was auch immer das sein mag).
InformationsquelleAutor Reid