我在iOS上编写类似工作线程或后台线程的东西。每次进入任务时,我都会将其放入后台线程中。但问题是,我不想每次都使用这个dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{});
,因为它会使任务在不同的线程中运行,并且创建一个线程需要花费很多时间。
所以我的问题是如何创建一个GCD队列并将其运行在同一个后台线程中,我会让它在结果出现时运行回主线程。
答案 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
}