IOS. Как узнать, когда NSOperationQueue завершит обработку нескольких операций?

Мне нужно в приложении для загрузки каталогов и их содержимого. Поэтому я решил реализовать NSOperationQueue и я подклассифицировал NSOperation для реализации NSURLRequest и т.д.

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

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

Я уже реализовал наблюдение за ключевыми значениями для operationCount NSOperationQueue и isFinished из NSOperation, но я не знаю, когда в каталоге есть все файлы в нем!

Есть ли у вас идеи?

Спасибо большое

Ответ 1

Добавьте "Готово" NSOperation, у которого есть все остальные NSOperations для одного каталога как зависимость.

Что-то вроде этого:

NSInvocationOperation *doneOp = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(done:) object:nil];

NSInvocationOperation *op1 = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(doSomething:) object:nil];
[queue addOperation:op1];
[doneOp addDependency:op1];

NSInvocationOperation *op2 = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(doSomething:) object:nil];
[queue addOperation:op2];
[doneOp addDependency:op2];

NSInvocationOperation *op3 = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(doSomething:) object:nil];
[queue addOperation:op3];
[doneOp addDependency:op3];

[queue addOperation:doneOp];

doneOp будет работать только после завершения op1, op2 и op3.

Ответ 2

[opQueue operationCount]

Надеюсь, что это поможет

Ответ 3

Одним из подходов было бы создать класс типа Directory со свойствами, такими как loadedCount (изначально 0) и fileCount (инициализировано каким бы то ни было количеством файлов в каталоге) и создать словарь, сопоставляющий каждый NSOperation с соответствующим каталогом, прежде чем добавлять операция в очередь. Внутри вашего обратного вызова isFinished вы можете вытащить объект Directory для данного NSOperation из словаря и увеличивать значение directory.loadedCount на 1. Если ваш directory.loadedCount == directory.fileCount, активируйте обновление для пользовательского интерфейса.

Ответ 4

Вы можете реорганизовать свой код, чтобы избежать очередности всех запросов одновременно. Запрашивать только запросы для одного каталога за раз. Когда operationCount достигает нуля, вы можете быть уверены, что все запросы завершены или завершены, обновите пользовательский интерфейс и запишите запросы для следующего каталога. Продолжайте, пока массив каталогов не станет пустым.

Преимущества:

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