4

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

在我的应用程序开始时,我希望在队列中执行一组功能,以便当一个结束时,另一个开始(我设置setMaxConcurrentOperationCount为 1 以便一次只发生一个操作)。一切都应该在后台发生,因为它是一种下载/上传到信息服务器的方式。

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

我的问题是,操作队列会等待第一个操作中启动的所有方法/线程完成,然后再开始第二个操作吗?

4

3 回答 3

1

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

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

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

现在我们有了 GCD,考虑块和调度队列作为一个更轻量级的替代方案通常是一个好主意NSOperation,另请参阅 上的–addOperationWithBlock:方法NSOperationQueue

于 2013-02-21T07:46:27.967 回答
0

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

于 2013-02-21T08:48:25.310 回答
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];
于 2014-08-30T06:22:29.150 回答