2016-07-21 3 views
0

нужно разархивировать 10 файлов в директории документа для этого я использовать отправка асинхр как этот, что произошло, если я использую более одного dispatch_async

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 файлов получают unzip, еще 5 файлов также получение разархивировано в одно и то же время?

как я могу сделать это эффективно?

любая помощь будет заметна.

+0

По в настоящее время вы используете значение качества обслуживания (например, 'QOS_CLASS_UTILITY'), а не' DISPATCH_QUEUE_PRIORITY_HIGH'. – Rob

ответ

0

Если вы распакуете общие файлы, это будет хорошо. Потому что это асинхронно. Если вы выполняете фоновое действие одновременно, если пытаетесь сделать другой фоновый процесс, это создает проблему.

DISPATCH_QUEUE_PRIORITY_HIGH товаров, отправляемые в очередь будут работать с высоким приоритетом, то очередь будет планироваться для выполнения перед приоритетом любого по умолчанию или низкий приоритет очереди.

Если вы хотите запустить один независимый очередь работы и вы не связаны с другими параллельными операциями, вы можете использовать глобальную параллельную очередь

dispatch_queue_t globalConcurrentQueue = 
dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0) 

Она работает асинхронно в фоновом потоке , Это делается потому, что анализ данных может занимать много времени, и он может блокировать основной поток, который остановит все анимации, и приложение не будет реагировать.

Grand Central Dispatch

dispatch_async

Asynchronous Operations

Apple Document

UI and main Thread

GLobal Queue

dispatch_sync and dispatch_async Process

0

Поскольку глобальные очереди параллельные очереди, ваш второй dispatch_async будет происходить одновременно с первым. Если вы это сделаете, вы должны убедиться, что:

  • Класс unzip/экземпляр является потокобезопасным;
  • Все обновления моделей должны быть synchronized; и
  • Использование пиковой памяти в результате одновременных операций с записями не слишком велико.

Если вышеуказанные условия не выполняются (например, если вы хотите, чтобы запустить эти почтовые задачи последовательно, а не одновременно), вы можете создать последовательную очередь для разархивации (с dispatch_queue_create). Таким образом, любые расстегивающие задачи, отправленные в эту очередь, будут выполняться последовательно в фоновом режиме, что предотвращает их одновременное выполнение.

0

Вызов dispatch_get_global_queue возвращает параллельную фоновую очередь (т. Е. Очередь, которая может работать больше, чем на элементе очереди одновременно на фоновом потоке), который управляется ОС. Параллельность операций действительно зависит от количества ядер, которые имеет устройство.

Каждый блок, который вы передаете dispatch_async, является элементом очереди, поэтому код внутри блока будет работать линейно по фоновому потоку, когда этот блок будет удален и запущен. Если, например, вы распаковка с для цикла, как таковые:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{ 
    for (int i = 0; i<5; i++) { 
     // Unzip here 
    } 

}) 

Тогда задача времени работы будет 5 х раз файл разархивировать. Объединение их в два набора из 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 
    }) 
} 
Смежные вопросы