2015-05-08 21 views
7

Ich bin relativ neu in Swift und Xcode im Allgemeinen und finde eine Menge Schwierigkeiten, dies herauszufinden.Code wird erst ausgeführt, nachdem die asynchrone Funktion ausgeführt wurde

Ich entwickle eine App, die den Parse.com Backend-Server verwendet. Um den Hauptthread nicht zu blockieren, wird jedes Mal, wenn die App etwas vom Server herunterlädt, asynchron an einem anderen Thread gearbeitet. Der Rest des Codes wird jedoch weiterhin im Hauptthread ausgeführt und stürzt ab, wenn die Daten, die vom Server stammen sollen, noch nicht heruntergeladen wurden. Ich würde gerne wissen, wie man Funktionen aufruft, die ausgeführt werden sollen, nachdem die asynchrone Funktion beendet ist, und dies muss für Funktionen in separaten Dateien getan werden.

Ich habe gelesen, dass Schließungen dabei helfen könnten, aber ich fand dort Syntax sehr schwierig und eine Erklärung würde sehr geschätzt werden. Aber jeder Weg wäre sehr hilfreich.

Dank

Antwort

13

Nun, rufen Sie einfach die Funktion am Ende des asynchronen Rückruf. Das ist, wenn der asynchrone Rückruf beendet ist - wenn alle anderen Dinge im asynchronen Rückruf beendet sind! So zum Beispiel:

func myMethod() { 
    // ... code ... 
    somebody.doSomethingWith(someObject, asynchronousCallback: { 
     (thing, otherThing) in 
     // ... do whatever 
     // --> CALL THE FUNCTION! 
    }) 
    // ... code ... 
} 

Wenn das Problem ist, dass Sie tun nicht wissen, welche Funktion aufzurufen, können Sie Ihre Umgebung Funktion/Objekt so konfigurieren, dass jemand kann Hand Sie eine Funktion, die dann ist das, was Du rufst an der Stelle an, wo ich oben "Funktion anrufen" gesagt habe.

Zum Beispiel:

func myMethod(f:() ->()) { // we receive the function as parameter 
    // ... code ... 
    somebody.doSomethingWith(someObject, asynchronousCallback: { 
     (thing, otherThing) in 
     // ... do whatever 
     // --> CALL THE FUNCTION, by saying: 
     f() 
    }) 
    // ... code ... 
} 
+0

Können Sie erklären, wie Sie eine Funktion zu übergeben? Ich habe vorher verstanden, dass Sie die Funktion ausführen, wo Sie "die Funktion aufrufen" geschrieben haben, aber die Funktion befindet sich, wie gesagt, in einer anderen Datei. Der spezielle Fall, mit dem ich gerade arbeite, ist, dass ich eine Funktion geschrieben habe, die zuerst prüft, ob das gesuchte Objekt im lokalen Datenspeicher ist, und falls nicht, überprüft es den Server. Da ich möchte, dass es überall läuft, lege ich es in eine separate Datei. Aber ich brauche es noch, um Funktionen in der Klasse aufzurufen, die es aufgerufen hat. Danke noch einmal. – Acoop

+0

Ich kann es sicherlich erklären _linguistisch_. In Swift sind Funktionen erstklassige Bürger, daher kann Funktion A Funktion B mit Funktion C, die Funktion B speichern kann, verknüpfen. Dann kann Funktion C oder irgendeine andere Funktion mit Zugriff auf die gespeicherte Funktion B Funktion B aufrufen _ Alle Rückrufe funktionieren. Wenn Sie 'UIView.animateWithDuration() {...}' sagen, übergeben Sie dies Cocoa - eine Funktion, die aufgerufen wird, um die Animation auszuführen. Sehen Sie auch mein Buch: http://www.apeth.com/swiftBook/ch02.html#_function_as_value – matt

+0

Jedoch, wie Sie es tun, _architecturally, ist Ihnen überlassen. Im obigen Beispiel könnte 'myMethod' eine Funktion als Parameter annehmen; dann bei "rufe die Funktion" an, du rufst es an. Aber es gibt viele andere mögliche Szenarien. Siehe diesen Beispielcode für ein Beispiel: https://github.com/matnteub/Programming-iOS-Book-Examples/blob/master/bk2ch24p842downloader/ch37p1099downloader/MyDownloader.swift – matt

3

Erweiterung auf Matts Antwort, können Sie myMethod ein Verfahren machen, die eine Schließung als Parameter übernimmt:

​func​ ​myMethod​(​completionBlock​: (result: String) ->()) 
{ 
    // ... code ... 
    somebody.doSomethingWith(someObject, asynchronousCallback: { 
     (thing, otherThing) in 
     // ... do whatever 
     completionBlock(thing) 
    }) 
    // ... code ... 
} 
Verwandte Themen