2013-02-21 70 views
4

我刚开始使用NSOperation/NSOprationQueue,所以原谅我问这个问题。 :PNSOperationQueue使用新线程在内部操作开始的并发操作

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

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

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

回答

1

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

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

并发操作有一组谓词,如-isExecuting-isFinished,并且有一个启动操作的-start方法。这种方法可能只是产生一些后台处理并立即返回,整个操作不被视为完成,直到-isFinished这么说。

现在我们已经GCD它通常是一个好主意,考虑块和调度队列为NSOperation较轻的替代方案,也看到了–addOperationWithBlock:方法上NSOperationQueue

0

如果NSOperation正在执行异步任务,如[NSURLConnection sendAsynchronousRequest:.....]比正在运行的线程不会等待响应,并且不会等待。一旦主方法的最后一条语句或块最后一条语句被执行,操作将从队列中移除并且下一个操作将开始。

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];