2013-07-17 3 views

Antwort

34

Erstellen Sie eine serielle Warteschlange, und verwenden Sie dispatch_set_target_queue(), um die Zielwarteschlange auf die Warteschlange mit hoher Priorität zu setzen.

Hier ist, wie:

dispatch_set_target_queue(myQueue, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0)); 

Jetzt myQueue mit hohen Priorität seriell ausgeführt werden soll. Hier ist another SO answer, wenn Sie mehr wissen möchten.

+0

ok gut, und das bedeutet immer noch, dass meine Warteschlange selbst seriell bleibt, aber dann ihre Arbeit in die gleichzeitige Warteschlange posten? –

+0

yup! Sollte genau das tun, was Sie wollten. –

+0

danke wirklich hilfreich! –

-2

Ist es eine Anforderung, dass Sie eine benutzerdefinierte Warteschlange haben? Wenn nicht, könnte man sich einen Block auf die hohe Priorität globale Warteschlange Dispatching, die Sie verwenden abrufen können:

dispatch_queue_t q = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0) 

bedenken Sie, dass dies die globale Warteschlange ist, so dass es andere gleichzeitige Vorgänge beeinflussen können.

+5

Die Voraussetzung ist, dass ich die Warteschlange seriell sein muss. –

2

Die dispatch_queue_attr_make_with_qos_class Funktion mag neu sein, da die akzeptierte Antwort geschrieben wurde, aber so etwas wie:

dispatch_queue_attr_t priorityAttribute = dispatch_queue_attr_make_with_qos_class(
    DISPATCH_QUEUE_SERIAL, QOS_CLASS_USER_INITIATED, -1 
); 

myQueue = dispatch_queue_create("com.MyApp.MyQueue", priorityAttribute); 

der Warteschlange eine hohe Priorität (‚Quality of Service‘) geben könnte. Es gibt eine höhere QOS-Klasse, aber QOS_CLASS_USER_INITIATED entspricht DISPATCH_QUEUE_PRIORITY_HIGH.

+1

Dies sollte jetzt die akzeptierte Antwort sein. Dies ist der richtige Weg, dies zu tun. – Rob

Verwandte Themen