NSOperationQueue与新线程在操作内部启动的并发操作

时间:2013-02-21 07:34:27

标签: iphone ios dependencies nsoperation nsoperationqueue

我刚刚开始使用NSOperation / NSOprationQueue,请原谅我提出这个问题。 :P

在我的应用程序开始时,我希望在队列中执行一些函数集,这样当一个函数结束时,另一个函数启动(我已将setMaxConcurrentOperationCount设置为1,因此只有一个操作发生在时间)。所有这些都应该在后台发生,因为它是一种下载/上传到服务器的信息。

我把第一个操作放在队列中,调用另一个方法,它可以调用一些新线程来执行其他一些操作。

我的问题是, 在开始第二次操作之前,Operation Queue是否会等待第一个操作中启动的所有方法/线程完成?

3 个答案:

答案 0 :(得分:1)

有两种NSOperation s,并发和非并发。

非并发操作在其-main方法中实现,当此方法返回时,操作被视为已完成。如果在-main中生成一个线程并希望操作在线程完成之前运行,则应该阻止执行-main直到线程完成(例如,使用信号量)。

并发操作有一组谓词,如-isExecuting-isFinished,并且有一个-start方法可以启动操作。这个方法可能只会产生一些后台处理并立即返回,整个操作在-isFinished这样说之后才算完成。

现在我们有了GCD,通常最好将块和调度队列视为NSOperation的替代方案,同时参见–addOperationWithBlock:上的NSOperationQueue方法。

答案 1 :(得分:0)

如果NSOperation正在执行类似[NSURLConnection sendAsynchronousRequest:.....]之类的异步任务,而不是运行操作的线程不会等待响应,它将不会等待。一旦执行main方法last语句或block last语句,就会从队列中删除操作,然后开始下一个操作。

答案 2 :(得分:0)

你可以使用这样的东西

NSOperationQueue *queue=[NSOperationQueue new];
[queue setMaxConcurrentOperationCount:1];
NSBlockOperation *blockOperation1 = [NSBlockOperation blockOperationWithBlock:^{
    //operation first
}];
NSBlockOperation *blockOperation2 = [NSBlockOperation blockOperationWithBlock:^{
    //operation second
}];
[blockOperation2 addDependency:blockOperation1];
[queue addOperation:blockOperation1];
[queue addOperation:blockOperation2];