2011-08-08 33 views
0

所以,我有一组ASINetworkQueues当前一起运行,导致数据库保存竞争条件。我试图创建一个NSOperationQueue,它将排队这些“子队列”中的每一个。我目前已经创建了一个NSOperation,其主要方法是启动“子队列”来启动它的下载。ios NSOperationQueue,操作全部运行时添加并且不排队

我的问题是,每次我使用“addOperation”向主队列添加子队列时,它立即激发“main”方法,所以我的子队列同时运行。我的印象是主要方法一度被解雇了。即仅用于队列顶部的操作。

也许我错过了这里的东西,但我似乎无法弄清楚如何拖延其他操作,直到第一个完成。另外,我似乎甚至无法让我的程序进入导致NSOperation的isReady = 0的情况..总是给出肯定回答。

这里的一些代码:

注:我已经设置的NSOperation队列maxConcurrentOperations为1

的NSOperation主要方法:

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

设置队列:

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

如果我添加多个操作,主要方法在实例上触发将其添加到队列中。是否有另一个功能,我应该重写和使用,当操作准备好摇晃。我有一种感觉,主要的方法是设置操作。

任何想法非常感谢。

非常感谢。

回答

2

NSOperationQueue只要能够平衡附加处理能力,就会触发主要方法。

要将队列一次限制为一个操作,您可以在对每个操作进行排队之前尝试添加依赖项: [B addDependency:A]; //直到A执行完毕,才会调用[B main]

但请注意,如果A被取消,B仍然会运行。

希望有帮助!

+0

你的意思是你的取出操作的数组中的队列中添加依赖于操作非常有用吗?为使依赖性正常工作,在将其添加到队列之前,需要将它们添加到每个操作中。 –

+1

好的,但操作是按钮单击创建并添加到队列中。那么如何在第一个操作被添加到队列之前添加第一个操作作为依赖关系到第二个操作,然后再点击另一个按钮。 任何想法? – conor

+0

嗯,那么在这种情况下,你可能想使用串行调度队列来代替操作队列。串行调度队列按照先进先出的顺序逐个执行一个队列。关于[并发编程指南](http://developer.apple.com/library/ios/#documentation/General/Conceptual/ConcurrencyProgrammingGuide/OperationQueues/OperationQueues)中的串行队列有很多有用的信息。html#// apple_ref/doc/uid/TP40008091-CH102-SW1) –

相关问题