2

Мне просто интересно, в какой именно момент выполняется завершение блока в NSOperation, принадлежащем NSOperationQueue.В какой момент точно выполняется завершение Блокировка выполняется на NSOperation?

В моем новом проекте клиент для Amazon S3 (https://github.com/StudioIstanbul/SIAFAWSClient), я использую NSOperation с завершающим блоком для запросов к API REST Amazon. Клиент может контролировать статус всех запланированных запросов через свойство в основном классе, называемом isBusy. В блоке завершения моей операции я устанавливаю значение для этого свойства НЕТ, если в моем NSOperationQueue нет других операций, запланированных в моем NSOperationQueue. Теперь я понял, что в некоторых редких случаях моя текущая NSOperation по-прежнему включена в мой NSOperationQueue, когда вызывается callBlock. Мне это кажется немного странным. Я решил проверить существование текущего NSOperation в моей очереди, чтобы исправить это, но это кажется ненужным с точки зрения дизайна.

__weak AWSOperation* thisOperation = operation; 
[operation setCompletionBlock:^{ 
    if (self.operationQueue.operationCount <= 0 
     || (self.operationQueue.operationCount == 1 
     && [self.operationQueue.operations objectAtIndex:0] == thisOperation)) { 
     [self willChangeValueForKey:@"isBusy"]; 
     _isBusy = NO; 
     [self didChangeValueForKey:@"isBusy"]; 
    } 
}]; 

У кого-нибудь есть дополнительная информация об этом изменении?

ответ

0

Из документов:

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

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

Ваш лучший вариант - обратить ваше внимание на следующую итерацию основной рабочей строки, если вы сами допросите очередь операций, чтобы определить состояние.

+0

Но это не говорит о том, что он не может работать после удаления операции. Я тоже удивлен. –

+0

он явно говорит, что нет гарантии точно, когда он будет запущен, потому что поток, на котором он будет запускаться, не гарантируется – Wain

+0

Да, но в любом потоке, который он запускает, он может быть запущен после удаления. –