iOS - Как узнать, когда NSOperationQueue завершит обработку нескольких операций? - PullRequest
11 голосов
/ 03 апреля 2012

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

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

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

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

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

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

Ответы [ 4 ]

48 голосов
/ 04 апреля 2012

Добавьте "Done" 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 завершат выполнение.

5 голосов
/ 05 февраля 2013
[opQueue operationCount]

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

0 голосов
/ 03 апреля 2012

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

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

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

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

...