需要在文档目录中解压缩10个文件,因为我使用像这样的调度异步
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{
// unzip 5 files
})
dispatch_async( dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{
// unzip another 5 files
})
我怀疑它会同时进行解压缩吗?
如果是这样,前5个文件解压缩,另外5个文件也是如此 同时解压缩?
我怎样才能有效地做到这一点?
任何帮助都会很明显。
答案 0 :(得分:0)
如果你解压缩总文件就会很好。因为它是异步的。如果你尝试做其他后台进程同时进行后台操作,那就会出问题。
DISPATCH_QUEUE_PRIORITY_HIGH分派给队列的项目将以高优先级运行,即队列将被安排在任何默认优先级或低优先级队列之前执行。
如果要运行单个独立的排队操作而不关心其他并发操作,可以使用全局并发队列
dispatch_queue_t globalConcurrentQueue =
dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)
它在后台线程上异步运行。这样做是因为解析数据可能是一项耗时的任务,并且它可能会阻止主线程停止所有动画并且应用程序无法响应。
答案 1 :(得分:0)
因为全局队列是并发队列,所以第二个dispatch_async
将与第一个队列同时发生。如果这样做,您必须确保:
如果不满足上述条件(即,如果要连续运行这些zip任务,而不是同时运行),则可以创建用于解压缩的串行队列(使用dispatch_queue_create
)。这样,分派到该队列的任何解压缩任务将在后台队列上串行执行,从而阻止它们同时运行。
答案 2 :(得分:0)
调用dispatch_get_global_queue
返回由OS管理的并发后台队列(即,能够在后台线程上一次运行队列项以上的队列)。操作的并发性实际上取决于设备具有的核心数量。
传递给dispatch_async的每个块都是一个队列项,因此当该块出列并运行时,块中的代码将在后台线程上线性运行。例如,如果你使用for循环解压缩,那么:
dispatch_async( dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{
for (int i = 0; i<5; i++) {
// Unzip here
}
})
然后任务运行时间为5 x文件解压缩时间。将它们分成两组5可能意味着总解压缩时间减半。
如果您希望所有10个文件都解压缩并具有最大并发性(即系统允许的并发性),那么您最好将10个块分配给global_queue,如下所示:
for (int i = 0; i<5; i++) {
dispatch_async( dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{
// Unzip here
})
}