Mark Wheeler
Mark Wheeler

Reputation: 697

Create a high priority serial dispatch queue with GCD

How can I create a custom serial queue that runs at high priority?

Right now I'm using myQueue = dispatch_queue_create("com.MyApp.MyQueue", NULL); but this doesn't seem to allow for setting a priority?

Upvotes: 23

Views: 14119

Answers (3)

user2067021
user2067021

Reputation: 4529

The dispatch_queue_attr_make_with_qos_class function may be new since the accepted answer was posted, but something like:

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);

could give the queue a high priority ('quality of service'). There is a higher QOS class, but QOS_CLASS_USER_INITIATED is equivalent to DISPATCH_QUEUE_PRIORITY_HIGH.

Upvotes: 19

Catfish_Man
Catfish_Man

Reputation: 41801

Create a serial queue, then use dispatch_set_target_queue() to set its target queue to the high priority queue.

Here's how:

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

Now myQueue should run serially with high priority. Here's another SO answer if you want to know more.

Upvotes: 38

Nathan Jones
Nathan Jones

Reputation: 1846

is it a requirement that you have a custom queue? If not, you could look at dispatching a block to the high priority global queue, which you can retrieve using:

dispatch_queue_t q = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0)

keep in mind that this is the global queue so it may impact other concurrent operations.

Upvotes: -3

Related Questions