2017-09-08 2 views
0

Ich bin so etwas wie ein Arbeitsthread oder Hintergrund Thread-Ding auf iOS. Jedes Mal, wenn eine Aufgabe kam, legte ich sie in einen Hintergrund-Thread. Aber das Problem ist, ich möchte dieses dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{}); nicht jedes Mal verwenden, weil es die Aufgabe in einem anderen Thread ausführen wird und ein Thread viel Zeit kostet.Wie Hintergrund-Task in derselben globalen Warteschlange hinzufügen?

Also meine Frage ist, wie eine GCD-Warteschlange zu machen und es in den gleichen Hintergrund-Thread ausführen, werde ich es zurück zum Haupt-Thread laufen lassen, wenn es herauskam.

Antwort

1

Sie scheinen "Thread" und "Warteschlange" zu verwenden, wie sie das gleiche sind. Sie sind nicht. Eine Warteschlange ist eine Abstraktion auf höherer Ebene, die unter Verwendung von 1 oder mehr tatsächlichen Threads implementiert werden kann.

Die Verwendung von dispatch_get_global_queue gibt Ihnen wahrscheinlich jedes Mal eine andere Warteschlange. Das erste, was Sie tun müssen, ist, eine einzige Warteschlange zu erstellen, die Sie verwenden, anstatt jedes Mal nach einer neuen Warteschlange zu fragen. Verwenden Sie dispatch_queue_create, um eine einzelne Warteschlange zu erstellen. Speichern Sie einen Verweis darauf in einem geeigneten Bereich, damit Sie ihn überall dort referenzieren können, wo Sie ihn benötigen.

Jetzt, da Sie nur eine einzige Warteschlange haben, müssen Sie entscheiden, ob die Warteschlange eine gleichzeitige Warteschlange oder eine serielle Warteschlange sein soll. Eine serielle Warteschlange verwendet nur 1 Thread, während eine gleichzeitige Warteschlange mehrere Threads verwenden kann. Sie erhalten die gewünschte Warteschlange, indem Sie den richtigen Wert an den attr Parameter der dispatch_queue_create Funktion übergeben.

Objective-C:

Erstellen der Warteschlange:

dispatch_queue_t myQueue = dispatch_queue_create(@"my_global_queue", DISPATCH_QUEUE_CONCURRENT); // or use DISPATCH_QUEUE_SERIAL 

die Warteschlange Verwendung:

dispatch_async(myQueue, ^{ 
    // code 
}); 

Swift:

die Warteschlange erstellen:

let myQueue = DispatchQueue(label: "my_global_queue") // serial 

oder:

let myQueue = DispatchQueue(label: "my_global_queue", attributes: .concurrent) // concurrent 

die Warteschlange verwenden:

myQueue.async { 
    // code 
} 
+0

Großer Dank !!! Ich habe es mit meinem Code gemacht –

Verwandte Themen