2016-07-21 10 views
0

Notwendigkeit, dass 10 Dateien in Dokumentenverzeichnis entpacken, ich benutze Versand async wie diese, was passiert, wenn ich verwenden mehr als eine dispatch_async

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{ 
// unzip 5 files 

}) 
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{ 
// unzip another 5 files 

}) 

meine Zweifel ist, wird es gleichzeitig die unzip tun?

Wenn es so ist, während die ersten 5 Dateien entpacken, werden weitere 5 Dateien auch gleichzeitig entpackt?

wie kann ich es effizient machen?

jede Hilfe wäre nennenswert.

+0

von So würden Sie heutzutage einen Quality of Service-Wert (zB 'QOS_CLASS_UTILITY') anstelle von' DISPATCH_QUEUE_PRIORITY_HIGH' verwenden. – Rob

Antwort

0

Wenn Sie die Gesamtzahl der Dateien entpacken, wird es gut sein. Weil es asynchron ist. Wenn Sie gleichzeitig Hintergrundoperationen ausführen, wenn Sie versuchen, andere Hintergrundprozesse durchzuführen, ist das problematisch.

DISPATCH_QUEUE_PRIORITY_HIGH Elemente, die an die Warteschlange gesendet werden, werden mit hoher Priorität ausgeführt, d. H. Die Warteschlange wird für die Ausführung vor einer Standardpriorität oder einer Warteschlange mit niedriger Priorität eingeplant.

Wenn Sie eine einzige unabhängige Warteschlange Vorgang ausgeführt werden soll, und Sie sind nicht besorgt mit anderen gleichzeitigen Operationen, können Sie die globale gleichzeitige Warteschlange verwenden

dispatch_queue_t globalConcurrentQueue = 
dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0) 

Es läuft asynchron auf einem Hintergrund-Thread . Dies geschieht, da das Parsen von Daten eine zeitaufwendige Aufgabe ist und den Haupt-Thread blockieren könnte, der alle Animationen stoppen würde und die Anwendung nicht reagieren würde.

Grand Central Dispatch

dispatch_async

Asynchronous Operations

Apple Document

UI and main Thread

GLobal Queue

dispatch_sync and dispatch_async Process

0

Da globale Warteschlangen gleichzeitig Warteschlangen sind, Ihre zweite dispatch_async wird gleichzeitig mit dem ersten geschehen. Wenn Sie dies tun, müssen Sie Folgendes sicherstellen:

  • Die Unzip-Klasse/Instanz ist threadsicher;
  • Alle Modellaktualisierungen müssen synchronized sein; und
  • Die maximale Speicherauslastung, die durch gleichzeitige ZIP-Vorgänge entsteht, ist nicht zu hoch.

Wenn die oben genannten Bedingungen nicht erfüllt sind (das heißt, wenn Sie nacheinander diese Zip-Aufgaben ausführen möchten, nicht gleichzeitig), können Sie eine serielle Warteschlange erstellen zum Entpacken (mit dispatch_queue_create). Auf diese Weise werden entpackende Aufgaben, die an diese Warteschlange gesendet werden, seriell in einer Hintergrundwarteschlange ausgeführt, sodass sie nicht gleichzeitig ausgeführt werden können.

0

Mit dem Aufruf dispatch_get_global_queue wird eine gleichzeitige Hintergrundwarteschlange (dh eine Warteschlange, die mehr als ein Warteschlangenelement gleichzeitig auf einem Hintergrundthread ausführen kann) zurückgegeben, die vom Betriebssystem verwaltet wird. Die Gleichzeitigkeit der Operationen hängt wirklich von der Anzahl der Kerne ab, die das Gerät hat.

Jeder Block, den Sie an dispatch_async übergeben, ist ein Warteschlangenelement, daher wird der Code innerhalb des Blocks linear im Hintergrundthread ausgeführt, wenn dieser Block aus der Warteschlange genommen und ausgeführt wird. Wenn Sie zum Beispiel mit einem sind unzipping for-Schleife, die als solche:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{ 
    for (int i = 0; i<5; i++) { 
     // Unzip here 
    } 

}) 

Dann wird die Aufgabe Laufzeit 5 x Datei entpacken Zeit sein wird. Wenn Sie sie in zwei Sätzen zu je 5 Stück aufteilen, könnte das bedeuten, dass die gesamte Entpackungszeit halbiert wird.

Wenn Sie alle 10 Dateien mit max Concurrency (dh so viel Parallelität als System ermöglicht) dekomprimiert wollen, dann würden Sie besser dran Dispatching 10 Blocks zum global_queue sein, wie zum Beispiel:

for (int i = 0; i<5; i++) { 

     dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{ 

     // Unzip here 
    }) 
} 
Verwandte Themen