如何修改自定义GCD队列的优先级?

Pro*_*ber 18 iphone concurrency grand-central-dispatch ios

我已经像这样创建了一个GCD队列:

dispatch_queue_t q = dispatch_queue_create("com.testcompany.myqueue", NULL);
Run Code Online (Sandbox Code Playgroud)

当我将任务分派给该队列时,它比在主线程上执行任务要慢.

dispatch_async(q, ^(void) {
    [self performHeavyCalculationAndUpdateUI];
});
Run Code Online (Sandbox Code Playgroud)

我怀疑默认情况下队列的优先级非常低.如何更改此队列的优先级?或者还有什么我必须做的吗?

Sve*_*ven 43

调度队列没有您可以更改的优先级.

您可以使用这些函数更改串行队列的目标队列,dispatch_set_target_queue并使用DISPATCH_QUEUE_PRIORITY_HIGH全局队列.这只是确保它将在具有默认或低优先级的队列中排队的任何其他块之前进行调度.一旦您的块开始执行,无论它安排在哪个队列上,它都不会运行得更快或更慢.

您的问题很可能是更新GUI,请参阅Robert Ryans的回答.

  • 感谢您解决原始问题,帮助我们这些人在我们的代码中找不到与UI相关的问题. (15认同)

Rob*_*Rob 7

如果您正在执行UIKit内容,则在您在辅助队列中运行的块中,通过以下方式将UI更新从辅助队列中调回主队列:

dispatch_async(q, ^(void) {
    [self performHeavyCalculationAndUpdateUI];

    dispatch_async(dispatch_get_main_queue(), ^{
        // do my ui update
    });
});
Run Code Online (Sandbox Code Playgroud)

只需将实际更新UI的几行调度回主队列,您将看到它不是队列优先级问题,而只是确保在主队列中发生UI更新.