如何在同一个全局队列中添加后台任务?

时间:2017-09-08 03:44:43

标签: ios multithreading grand-central-dispatch

我在iOS上编写类似工作线程或后台线程的东西。每次进入任务时,我都会将其放入后台线程中。但问题是,我不想每次都使用这个dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{});,因为它会使任务在不同的线程中运行,并且创建一个线程需要花费很多时间。

所以我的问题是如何创建一个GCD队列并将其运行在同一个后台线程中,我会让它在结果出现时运行回主线程。

1 个答案:

答案 0 :(得分:1)

你好像正在使用"线程"和"队列"喜欢他们是一回事。他们不是。队列是更高级别的抽象,可以使用一个或多个实际线程来实现。

每次使用dispatch_get_global_queue都可能会为您提供不同的队列。因此,您需要做的第一件事是创建一个您使用的单个队列,而不是每次都要求一个新队列。使用dispatch_queue_create创建单个队列。在适当的范围内存储对它的引用,以便您可以在需要的地方引用它。

现在您只有一个队列,您需要确定队列是并发队列还是串行队列。串行队列只使用1个线程,而并发队列可以使用多个线程。通过将适当的值传递给attr函数的dispatch_queue_create参数,可以获得所需的队列。

目标-C:

创建队列:

dispatch_queue_t myQueue = dispatch_queue_create(@"my_global_queue", DISPATCH_QUEUE_CONCURRENT); // or use DISPATCH_QUEUE_SERIAL

使用队列:

dispatch_async(myQueue, ^{
    // code
});

夫特:

创建队列:

let myQueue = DispatchQueue(label: "my_global_queue") // serial

或:

let myQueue = DispatchQueue(label: "my_global_queue", attributes: .concurrent) // concurrent

使用队列:

myQueue.async {
    // code
}