Der Zweck des synchronedispatch_apply
ist asynchron senden Sie die innere Schleife Interaktionen zu verfügbaren Ressourcen paralleler Verarbeitung. Somit kann die Gesamtschleifenleistung beschleunigt werden.
Schnellere Schleifenleistung? Sehr wahrscheinlich, ja. (siehe Vorbehalt)
Blockiert die Thread-Aufruf dispatch_apply
? Ja, genau wie Schleifenblöcke bis zum Abschluss.
Für GCD ist dispatch_apply
Synchron seit dispatch_apply
kehrt erst alle die asynchronen, parallel Aufgaben, die dispatch_apply
abgeschlossen erstellt.
jedoch jede einzelne Aufgabe Warteschlange eingereiht durch dispatch_apply
asynchrone als gleichzeitige Aufgaben ausführen kann wenn das Ziel ist queue
asynchrone.
Zum Beispiel in Swift:
let batchCount: Int = 10
let queue = dispatch_get_global_queue(QOS_CLASS_UTILITY, 0)
dispatch_apply(batchCount, queue) {
(i: Int) -> Void in
print(i, terminator: " ")
}
print("\ndispatch_apply QOS_CLASS_UTILITY queue completed")
ergibt ungeordnete Ausgabe wie: So,
0 8 1 9 2 3 4 5 6 7
dispatch_apply QOS_CLASS_UTILITY queue completed
dispatch_apply
synchron blockiert, wenn sie aufgerufen, aber die "Charge" von Aufgaben, die von dispatch_apply
laufen gleichzeitig, asynchron, parallel zueinander.
Denken Sie daran, dass ...
die während geleistete Arbeit jede Iteration unterscheidet von der Arbeit bei allen anderen Iterationen durchgeführt, und die Reihenfolge, in der jede aufeinanderfolgende Schleife
auch unwichtig fertig ist zu beachten, dass Die Verwendung einer seriellen Warteschlange für die Aufgaben der inneren Schleife hat keinen Leistungsgewinn.
Obwohl eine serielle Warteschlange mit zulässig ist und das Richtige tut für Ihren Code, wie eine Warteschlange verwendet, hat keine wirklichen Leistungsvorteile über die Schleife an Ort und Stelle zu verlassen.
Awesome, das ist genau das, was ich tun möchte. Vielen Dank. – Jessica