如何在同一个全局队列中添加后台任务?
How to add background task in same global queue?
我正在 iOS 上编写类似工作线程或后台线程的代码。每次有任务进来,我都会把它放到后台线程中。但问题是,我不想每次都使用这个dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{});
,因为它会使任务运行在不同的线程中,并且创建一个线程会花费很多时间。
所以我的问题是如何制作一个 GCD 队列并将其 运行 放在同一个后台线程中,我会在结果出来时 运行 返回主线程。
您似乎在使用 "thread" 和 "queue",就像它们是同一件事一样。他们不是。队列是更高级别的抽象,可以使用 1 个或多个实际线程来实现。
使用 dispatch_get_global_queue
可能每次都会给您不同的队列。因此,您需要做的第一件事是创建一个您使用的队列,而不是每次都请求一个新队列。使用 dispatch_queue_create
创建单个队列。在某个适当的范围内存储对此的引用,以便您可以在任何需要的地方引用它。
现在您只有一个队列,您需要决定该队列是并发队列还是串行队列。串行队列只会使用 1 个线程,而并发队列可以使用多个线程。通过将正确的值传递给 dispatch_queue_create
函数的 attr
参数,您可以获得所需的队列。
Objective-C:
创建队列:
dispatch_queue_t myQueue = dispatch_queue_create(@"my_global_queue", DISPATCH_QUEUE_CONCURRENT); // or use DISPATCH_QUEUE_SERIAL
使用队列:
dispatch_async(myQueue, ^{
// code
});
Swift:
创建队列:
let myQueue = DispatchQueue(label: "my_global_queue") // serial
或:
let myQueue = DispatchQueue(label: "my_global_queue", attributes: .concurrent) // concurrent
使用队列:
myQueue.async {
// code
}
我正在 iOS 上编写类似工作线程或后台线程的代码。每次有任务进来,我都会把它放到后台线程中。但问题是,我不想每次都使用这个dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{});
,因为它会使任务运行在不同的线程中,并且创建一个线程会花费很多时间。
所以我的问题是如何制作一个 GCD 队列并将其 运行 放在同一个后台线程中,我会在结果出来时 运行 返回主线程。
您似乎在使用 "thread" 和 "queue",就像它们是同一件事一样。他们不是。队列是更高级别的抽象,可以使用 1 个或多个实际线程来实现。
使用 dispatch_get_global_queue
可能每次都会给您不同的队列。因此,您需要做的第一件事是创建一个您使用的队列,而不是每次都请求一个新队列。使用 dispatch_queue_create
创建单个队列。在某个适当的范围内存储对此的引用,以便您可以在任何需要的地方引用它。
现在您只有一个队列,您需要决定该队列是并发队列还是串行队列。串行队列只会使用 1 个线程,而并发队列可以使用多个线程。通过将正确的值传递给 dispatch_queue_create
函数的 attr
参数,您可以获得所需的队列。
Objective-C:
创建队列:
dispatch_queue_t myQueue = dispatch_queue_create(@"my_global_queue", DISPATCH_QUEUE_CONCURRENT); // or use DISPATCH_QUEUE_SERIAL
使用队列:
dispatch_async(myQueue, ^{
// code
});
Swift:
创建队列:
let myQueue = DispatchQueue(label: "my_global_queue") // serial
或:
let myQueue = DispatchQueue(label: "my_global_queue", attributes: .concurrent) // concurrent
使用队列:
myQueue.async {
// code
}