我刚刚开始使用NSOperation / NSOprationQueue,请原谅我提出这个问题。 :P
在我的应用程序开始时,我希望在队列中执行一些函数集,这样当一个函数结束时,另一个函数启动(我已将setMaxConcurrentOperationCount
设置为1,因此只有一个操作发生在时间)。所有这些都应该在后台发生,因为它是一种下载/上传到服务器的信息。
我把第一个操作放在队列中,调用另一个方法,它可以调用一些新线程来执行其他一些操作。
我的问题是, 在开始第二次操作之前,Operation Queue是否会等待第一个操作中启动的所有方法/线程完成?
答案 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];