In meiner App habe ich eine Funktion, die eine NSRURLSession erstellt und eine NSURLRequest mit sendet
sesh.dataTaskWithRequest(req, completionHandler: {(data, response, error)
Im Abschlussblock für diese Aufgabe muss eine Berechnung durchgeführt werden, die dem aufrufenden Ansichtscontroller ein UIImage hinzufügt. Ich habe eine Funktion namens
func displayQRCode(receiveAddr, withAmountInBTC:amountBTC)
das macht die UIImage-Addition Berechnung. Wenn ich versuche, den Code zum Hinzufügen von Ansichten innerhalb des Abschlussblocks auszuführen, gibt Xcode einen Fehler aus, der besagt, dass ich die Layout-Engine während eines Hintergrundprozesses nicht verwenden kann. Also habe ich auf SO Code gefunden, der versucht, eine Methode im Hauptthread in die Warteschlange zu stellen:
let time = dispatch_time(DISPATCH_TIME_NOW, Int64(0.0 * Double(NSEC_PER_MSEC)))
dispatch_after(time, dispatch_get_main_queue(), {
let returned = UIApplication.sharedApplication().sendAction("displayQRCode:", to: self.delegate, from: self, forEvent: nil)
})
Ich weiß jedoch nicht, wie ich diesem Funktionsaufruf die Parameter "receiveAddr" und "amountBTC" hinzufügen soll. Wie würde ich das tun oder kann jemand einen optimalen Weg vorschlagen, um einen Methodenaufruf zur Hauptwarteschlange der Anwendung hinzuzufügen?
Swift 3+ & Swift 4 Version:
Swift 3 und Xcode 9.2:
quelle
Swift 2
Bei Verwendung von Trailing Closures wird dies zu:
Trailing Closures ist ein schneller syntaktischer Zucker, mit dem der Abschluss außerhalb des Funktionsparameterbereichs definiert werden kann. Weitere Informationen finden Sie unter Trailing Closures im Swift 2.2 Programmiersprachenhandbuch.
Im Fall dispatch_async ist die API
func dispatch_async(queue: dispatch_queue_t, _ block: dispatch_block_t)
seit demdispatch_block_t
Typ Alias für() -> Void
- Ein Abschluss, der 0 Parameter empfängt und keinen Rückgabewert hat, und Block ist der letzte Parameter der Funktion, für die wir den Abschluss im äußeren Bereich von definieren könnendispatch_async
.quelle
Laden Sie collectionView im Hauptthread neu
quelle
Hier ist die schönere (IMO) Swifty / Cocoa-Syntax, um das gleiche Ergebnis wie bei den anderen Antworten zu erzielen:
Oder Sie können die beliebte Async Swift-Bibliothek für noch weniger Code und mehr Funktionalität nutzen:
quelle
OperationQueue.main.addOperation({ }
Der richtige Weg, dies zu tun, besteht darin, dispatch_async in der main_queue zu verwenden, wie ich es im folgenden Code getan habe
quelle
Hier ist eine nette kleine globale Funktion, die Sie für eine schönere Syntax hinzufügen können:
Und Nutzung
quelle
quelle
Vergiss nicht, dich selbst zu schwächen, wenn du dich innerhalb des Verschlusses verwendest.
quelle