首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何修改自定义GCD队列的优先级?

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

Stack Overflow用户
提问于 2012-04-01 22:12:34
回答 2查看 10.5K关注 0票数 18

我创建了一个GCD队列,如下所示:

代码语言:javascript
复制
dispatch_queue_t q = dispatch_queue_create("com.testcompany.myqueue", NULL);

当我将任务分派到该队列时,它比简单地在主线程上执行任务要慢得多。

代码语言:javascript
复制
dispatch_async(q, ^(void) {
    [self performHeavyCalculationAndUpdateUI];
});

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-04-01 22:58:42

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

代码语言:javascript
复制
dispatch_async(q, ^(void) {
    [self performHeavyCalculationAndUpdateUI];

    dispatch_async(dispatch_get_main_queue(), ^{
        // do my ui update
    });
});

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

票数 7
EN

Stack Overflow用户

发布于 2012-04-02 07:34:19

我认为您忽略了异步活动的要点。@RobertRyan关于如果在辅助队列上执行UI更新不能快速显示的评论是错误的。所有UI更新都需要在主队列上执行。句号。

但是回到GCD和异步队列。@Sven是对的,您不能更改分派队列的优先级。GCD中的队列以FIFO (先进先出)的方式工作,因此您对它们进行排队的顺序就是它们被执行的顺序。这就是为什么使用GCD是线程安全的部分原因;您可以保证不会因为这个FIFO队列优先级而遇到任何问题。第二件要理解的事情是,当您对队列执行dispatch_async操作时,操作系统不能保证何时处理该队列。这是一种设置并忘记它的过程。如果您需要知道队列何时完成处理,您需要设置一个完成块处理程序(您会注意到许多Apple框架已经开始实现这一点),以便收到通知。这就是为什么苹果建议在你的第一个dispatch_async调用中嵌套一个dispatch_async调用,并请求主线程进行UI更新。因此,您的代码将如下所示:

代码语言:javascript
复制
dispatch_async(q, ^{
    [self performHeavyCalculations];
    dispatch_async(dispatch_get_main_queue, ^{
        // some UI updates
    });
});

由于GCD的入队和出队方式,将UI更新异步调度回主队列将允许UI更新发生,而不会对用户造成明显的延迟。如果您的UI更新依赖于performHeavyCalculations的结果,那么您将需要设置一个完成处理程序或委托方案来通知主队列此操作何时完成,以便可以进行更新。如果计算和更新之间的延迟太长,您可能需要查看计算方法中所做的事情,因为计算方法花费了这么长的时间。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9965018

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档