Если вы собираетесь использовать одну и ту же очередь для добавления новых операций, тогда нет смысла освобождать ее и создавать новую. Достаточно просто отменить все операции и затем добавить дополнительные операции. Вы можете сделать это, вызвав cancelAllOperations в очереди. Обратите внимание, что операции, которые уже выполняются, продолжат выполняться, если они не проверят отмену.
Этот метод отправляет сообщение об отмене всем операциям, которые в данный момент находятся в очереди. Операции в очереди отменяются до того, как они начнут выполняться. Если операция уже выполняется, эта операция должна распознать отмену и прекратить выполнение.
Будет или нет освобождение очереди немедленно освобождать поставленные в очередь операции или не документировано и, следовательно, должно рассматриваться как неопределенное поведение. Поэтому не следует полагать, что он будет работать в любом случае, и не следует полагаться на него (см. , опасный для автоматического выпуска NSOperationQueue ).
Однако имеются свидетельства того, что операции сохранят свою очередь, например, что очереди GCD сохраняются системой, пока они выполняют / ожидают асинхронные блоки. Вы можете прочитать в документации Grand Central Dispatch , что «очередь пересматривается системой до тех пор, пока блок не завершится». Тем не менее, документация не определяет поведение для NSOperationQueues, как упомянуто выше.
dispatch_async
Отправляет блок для асинхронного выполнения в очередь отправки и немедленно возвращается.
void dispatch_async(
dispatch_queue_t queue,
dispatch_block_t block);
Параметры
Очередь
Очередь для отправки блока. Очередь сохраняется системой до тех пор, пока блок не завершится. Этот параметр не может быть NULL.
блок
Блок для отправки в целевую очередь отправки. Эта функция выполняет Block_copy и Block_release от имени вызывающих абонентов. Этот параметр не может быть NULL.
Обсуждение
Эта функция является основным механизмом отправки блоков в очередь отправки. Вызовы этой функции всегда возвращаются сразу после отправки блока и никогда не ждут, пока блок будет вызван. Целевая очередь определяет, вызывается ли блок последовательно или одновременно по отношению к другим блокам, представленным в этой же очереди. Независимые последовательные очереди обрабатываются одновременно по отношению друг к другу.