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

我创build了这样的GCD队列:

dispatch_queue_t q = dispatch_queue_create("com.testcompany.myqueue", NULL); 

当我将任务派送到该队列时,比在主线程上执行任务要慢。

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

我怀疑这个队列的默认优先级很低。 我怎样才能改变这个队列的优先级? 还是有什么我必须做的?

如果你正在做UIKit的东西,在二级队列上运行的块中,通过以下方式将UI更新从二级队列中分派回主队列:

 dispatch_async(q, ^(void) { [self performHeavyCalculationAndUpdateUI]; dispatch_async(dispatch_get_main_queue(), ^{ // do my ui update }); }); 

只需将实际更新UI的几行发送回主队列,您就会发现这不是队列优先级的问题,而只是确保UI更新发生在主队列中。

调度队列没有优先级,你可以改变。

您可以使用dispatch_set_target_queue函数更改串行队列的目标队列 ,并使用DISPATCH_QUEUE_PRIORITY_HIGH全局队列。 这只是确保在任何其他块以排队或缺省优先级队列之前排定。 一旦你的块开始执行,它不会运行得更快或更慢,不pipe它被安排在什么队列上。

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

我认为你错过了asynchronous活动的重点。 @ RobertRyan关于UI更新的评论,如果在二级队列上执行,则不会很快显示出来是错误的。 所有UI更新都需要在主队列上执行。 期。

但是回到GCD和asynchronous队列。 @Sven是正确的,你不能改变调度队列的优先级。 GCD中的队列以FIFO(先进先出)方式工作,所以排队的顺序就是它们执行的顺序。这就是为什么使用GCD是线程安全的原因之一。 你保证你不会遇到任何问题,因为这个FIFO队列的优先级。 第二个要理解的是,当你dispatch_async一个队列时,操作系统不能保证该队列何时被处理。 这是一种“一劳永逸”的过程types。 如果您需要知道队列何时完成处理,您需要设置一个完成块处理程序(您会注意到许多Apple的框架已经开始执行此操作)以获得通知。 这就是为什么苹果build议您在第一个dispatch_async调用中嵌套dispatch_async调用并请求主线程进行UI更新。 所以,你的代码看起来像这样:

 dispatch_async(q, ^{ [self performHeavyCalculations]; dispatch_async(dispatch_get_main_queue, ^{ // some UI updates }); }); 

由于GCD如何排队和出队,asynchronous地将UI更新分派回主队列将允许UI更新发生,而不会给用户带来明显的延迟。 如果您的UI更新取决于performHeavyCalculations的结果,则需要设置完成处理程序或委托scheme,以通知主队列何时完成,以便可以进行更新。 如果计算和更新之间的延迟时间太长,则可能需要查看在计算方法中所花的时间太长了。