我创建了一个GCD队列,如下所示:
dispatch_queue_t q = dispatch_queue_create("com.testcompany.myqueue", NULL);当我将任务分派到该队列时,它比简单地在主线程上执行任务要慢得多。
dispatch_async(q, ^(void) {
[self performHeavyCalculationAndUpdateUI];
});我怀疑默认情况下队列的优先级非常低。如何更改此队列的优先级?或者还有什么我必须做的吗?
发布于 2012-04-01 22:58:42
如果您正在执行UIKit操作,则在运行在辅助队列上的块中,通过以下方式将UI更新从辅助队列中分派回主队列:
dispatch_async(q, ^(void) {
[self performHeavyCalculationAndUpdateUI];
dispatch_async(dispatch_get_main_queue(), ^{
// do my ui update
});
});只需将实际更新UI的几行分派回主队列,您就会发现这不是队列优先级的问题,而只是确保UI更新发生在主队列中。
发布于 2012-04-02 07:34:19
我认为您忽略了异步活动的要点。@RobertRyan关于如果在辅助队列上执行UI更新不能快速显示的评论是错误的。所有UI更新都需要在主队列上执行。句号。
但是回到GCD和异步队列。@Sven是对的,您不能更改分派队列的优先级。GCD中的队列以FIFO (先进先出)的方式工作,因此您对它们进行排队的顺序就是它们被执行的顺序。这就是为什么使用GCD是线程安全的部分原因;您可以保证不会因为这个FIFO队列优先级而遇到任何问题。第二件要理解的事情是,当您对队列执行dispatch_async操作时,操作系统不能保证何时处理该队列。这是一种设置并忘记它的过程。如果您需要知道队列何时完成处理,您需要设置一个完成块处理程序(您会注意到许多Apple框架已经开始实现这一点),以便收到通知。这就是为什么苹果建议在你的第一个dispatch_async调用中嵌套一个dispatch_async调用,并请求主线程进行UI更新。因此,您的代码将如下所示:
dispatch_async(q, ^{
[self performHeavyCalculations];
dispatch_async(dispatch_get_main_queue, ^{
// some UI updates
});
});由于GCD的入队和出队方式,将UI更新异步调度回主队列将允许UI更新发生,而不会对用户造成明显的延迟。如果您的UI更新依赖于performHeavyCalculations的结果,那么您将需要设置一个完成处理程序或委托方案来通知主队列此操作何时完成,以便可以进行更新。如果计算和更新之间的延迟太长,您可能需要查看计算方法中所做的事情,因为计算方法花费了这么长的时间。
https://stackoverflow.com/questions/9965018
复制相似问题