是否可以在全局队列上使用dispatch_async运行的块在主线程上执行?

时间:2016-04-27 10:47:27

标签: ios swift grand-central-dispatch dispatch-async

如果我说时间可能会发生主线程忙于某些global_queue任务?

例如。我有一些任务要执行,我使用以下语句之一:

    dispatch_async(dispatch_get_global_queue(QOS_CLASS_BACKGROUND, 0)) {
      // task 1
    }

// or

    dispatch_async(dispatch_get_global_queue(QOS_CLASS_UTILITY, 0)) {
      // task 2
    }

是否可能意外地在主线程上执行此任务?或者它是不可能的,因为主线程被锁定为全局队列? 谢谢!

2 个答案:

答案 0 :(得分:4)

如果在全局队列上调度,它将在全局队列上运行。如果您调度到主队列,它将在主队列上运行。如果您调度到自己创建的队列,它将在该队列上运行。

你问过"但是如果主线程空闲,它可以从global_queue"接受任务。不,那将完全忽略这一点。如果主队列空闲,则所有CPU都可用于运行后台任务,因此后台线程运行速度更快。主队列从另一个队列中获取任务是没有意义的。

答案 1 :(得分:1)

实际上,这不应该发生,但是当您通过指定QOS类获得队列时,严格来说,您获得的队列是实现细节,您不应该依赖它作为特定队列(或者不是特定的队列。)此外,任何给定队列用于满足排队工作的线程实现细节。

但实际上,不,我不希望看到在主线程上执行QOS_CLASS_BACKGROUNDQOS_CLASS_UTILITY的工作排队。

如果您想说服自己,可以检查队列是否从dispatch_get_global_queue(QOS_CLASS_UTILITY, 0) == dispatch_get_main_queue()返回,同样,在您的工作单位内,您可以检查[NSThread isMainThread]以查看您是否在主线程上执行。