Отмена NSOperation - PullRequest
       4

Отмена NSOperation

0 голосов
/ 09 февраля 2012

Я использую следующий код в цикле:

-(void)getUpdatedComments
{
    if(checkComments)
    {

        objParseOperation=[[ParseOperation alloc] initWithUDID:[[NSUserDefaults standardUserDefaults] valueForKey:kDeviceUDID]:self];
        [operationQueue addOperation:objParseOperation3];

    }
}

, где operationQueue - объект типа NSOperationQueue.Я вызываю этот метод каждые несколько секунд.

Если я вызываю этот метод после первого раза, мне нужно отменить предыдущую операцию или просто выполнить [objParseOperation release]?

1 Ответ

2 голосов
/ 09 февраля 2012

Если вы собираетесь использовать одну и ту же очередь для добавления новых операций, тогда нет смысла освобождать ее и создавать новую. Достаточно просто отменить все операции и затем добавить дополнительные операции. Вы можете сделать это, вызвав 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.

Обсуждение

Эта функция является основным механизмом отправки блоков в очередь отправки. Вызовы этой функции всегда возвращаются сразу после отправки блока и никогда не ждут, пока блок будет вызван. Целевая очередь определяет, вызывается ли блок последовательно или одновременно по отношению к другим блокам, представленным в этой же очереди. Независимые последовательные очереди обрабатываются одновременно по отношению друг к другу.

...