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.
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
ReturnType
ist normalerweise Void
. In Ihrem Fall könnten Sie
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%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.
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%Tags und Links ios asynchronous swift parse.com