ios NSOperationQueue, все операции выполняются при добавлении и не ставятся в очередь - PullRequest
0 голосов
/ 09 августа 2011

Итак, у меня есть группа 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];

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

Любые идеи очень ценятся.

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

Ответы [ 2 ]

2 голосов
/ 09 августа 2011

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

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

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

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

0 голосов
/ 05 января 2012

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

...