ios NSOperationQueue, все операции запускаются при добавлении и не ставятся в очередь

Итак, у меня есть группа ASINetworkQueues, которые в настоящее время работают вместе, что приводит к состоянию гонки, когда дело доходит до сохранения БД. Я пытаюсь создать NSOperationQueue, который будет ставить в очередь каждую из этих «подочередей». В настоящее время я создал NSOperation с основным методом, который запускает «подочередь», чтобы начать загрузку.

Моя проблема в том, что каждый раз, когда я добавляю подочередь в основную очередь с помощью «addOperation», он сразу запускает этот «основной» метод, поэтому мои подочереди выполняются одновременно. У меня сложилось впечатление, что основной метод запускался по одному. т. е. только для операции в начале очереди.

Может быть, я что-то упускаю, но я не могу понять, как остановить другие операции, пока не завершится первая. Кроме того, я даже не могу поставить свою программу в ситуацию, которая приводит к isReady = 0 для NSOperation..., которая всегда возвращает да.

вот код:

ПРИМЕЧАНИЕ. Я установил для очереди NSOperation maxConcurrentOperations значение 1.

Основной метод NSOperation:

-(void)main {
    [subQueue download];
}

Настройка очереди:

ChapterDownloadOperation *cdo =  [[ChapterDownloadOperation alloc] init];
cdo.chapter = ch;
[chapterDownloadQueue addOperation:cdo];
[cdo release];

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

Любые идеи с благодарностью.

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


person jim    schedule 08.08.2011    source источник


Ответы (2)


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

Чтобы ограничить очередь одной операцией за раз, вы можете попробовать добавить зависимости между каждой операцией перед тем, как поставить их в очередь: [B addDependency:A]; //[B main] не будет вызываться, пока A не завершит выполнение

Однако обратите внимание, что если A отменяется, B все равно будет работать.

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

person Purple Ninja    schedule 08.08.2011
comment
Вы имеете в виду, что вы добавили зависимости к операциям, получив массив операций в очереди? Чтобы зависимости работали правильно, вам нужно добавить их в каждую операцию ДО того, как вы добавите ее в очередь. - person Purple Ninja; 09.08.2011
comment
Хорошо, но операции создаются и добавляются в очередь по нажатию кнопки. Итак, как я могу добавить первую операцию в качестве зависимости от второй, когда первая добавляется в очередь до того, как была нажата другая кнопка. Любые идеи? - person jim; 09.08.2011
comment
Хм, тогда в этом случае вы можете захотеть использовать последовательную очередь отправки вместо очереди операций. Очередь последовательной отправки выполняется по одному, в порядке «первым пришел, первым вышел». Много полезной информации о последовательных очередях можно найти в Руководство по параллельному программированию - person Purple Ninja; 09.08.2011
comment
Хорошо, спасибо. Я только что преобразовал слиток массива в очередь и использовал глобальное логическое значение в качестве семафора. Похоже, сейчас все работает нормально, я посмотрю очереди последовательной отправки, когда у меня будет шанс. Большое спасибо! - person jim; 09.08.2011

Я нашел этот пример очень полезным http://developer.apple.com/library/ios/#samplecode/ListAdder/Introduction/Intro.html

person Praveen R    schedule 05.01.2012