Мне просто интересно, в какой именно момент выполняется завершение блока в 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"];
}
}];
У кого-нибудь есть дополнительная информация об этом изменении?
Но это не говорит о том, что он не может работать после удаления операции. Я тоже удивлен. –
он явно говорит, что нет гарантии точно, когда он будет запущен, потому что поток, на котором он будет запускаться, не гарантируется – Wain
Да, но в любом потоке, который он запускает, он может быть запущен после удаления. –