iOS - Swift - Funktion, die asynchron abgerufenen Wert zurückgibt

8

Ich habe also ein PFFile-Objekt von Parse, und ich versuche, eine Funktion zu erstellen, die die UIImage-Darstellung dieses PFFile abruft und es zurückgibt. Etwas wie:

%Vor%

Allerdings ist das Problem hier offensichtlich. Ich werde jedes Mal Null erhalten, da die Funktion getDataInBackroundWithBlock asynchron ist. Gibt es eine Möglichkeit zu warten, bis der UIImage abgerufen wurde, bevor die Image-Variable zurückgegeben wird? Ich weiß nicht, ob die synchrone getData () in diesem Fall ein effizienter Weg ist.

    
Ryan Bobrowski 03.08.2015, 18:44
quelle

3 Antworten

11

Ja, das ist möglich. Es heißt closure , oder häufiger ein callback . A callback ist im Wesentlichen eine Funktion, die Sie als Argument in anderen Funktionen verwenden können. Die Syntax des Arguments ist

%Vor%

ReturnType ist normalerweise Void . In Ihrem Fall könnten Sie

verwenden %Vor%

Die Syntax des Aufrufs einer Funktion mit einem Callback ist

%Vor%

Und die Syntax zum Aufruf einer Funktion mit mehreren Callbacks ist (eingerückt, um das Lesen zu erleichtern)

%Vor%

Wenn die Funktion die Funktion zurückweist (wird aufgerufen, nachdem die Funktion zurückkehrt), müssen Sie @escaping vor dem Argumenttyp

hinzufügen

Sie werden einen einzelnen Callback verwenden wollen, der aufgerufen wird, nachdem die Funktion zurückkehrt und UIImage? als Ergebnis enthält.

Ihr Code könnte also ungefähr so ​​aussehen

%Vor%

Und um es zu nennen, könntest du einfach

verwenden %Vor%     
Jojodmo 03.08.2015, 18:49
quelle
3

Was Sie wollen, ist genau das, was das Versprechen / zukünftige Designmuster tut. Es gibt viele Implementierungen in Swift. Ich werde als Beispiel die ausgezeichnete BrightFutures-Bibliothek verwenden. ( Ссылка )

Hier der Code:

%Vor%

Erklärung: Was Sie im Grunde tun, ist ein "Versprechen", dass es ein Ergebnis in der "Zukunft" geben wird. Und Sie geben dieses Zukunftsversprechen sofort zurück, bevor die asynchrone Methode abgeschlossen ist.

Der Aufrufer dieser Methode wird es so behandeln:

%Vor%

Im onSuccess-Handler machen Sie alles mit dem erfolgreich heruntergeladenen Bild. Wenn ein Fehler vorliegt, behandeln Sie ihn im onFailure-Handler.

Dies löst das Problem der Rückgabe von "nil" und ist auch eine der besten Praktiken, um asynchrone Prozesse zu handhaben.

    
Darko 03.08.2015 19:44
quelle
1

Ich empfehle das nicht

Ich habe eine kleine Bibliothek für Swift 2.0 geschrieben, die zwischen synchronen und asynchronen Methoden konvertieren kann, was Ihr Wunsch ist. Es kann hier gefunden werden. Lesen Sie den Disclaimer, der erklärt, in welchen Szenarien es in Ordnung ist, es zu verwenden (höchstwahrscheinlich nicht in Ihrem Fall)

Sie könnten es so verwenden:

%Vor%     
Kametrixom 24.08.2015 02:28
quelle

Tags und Links