如何在NSOperationQueue完成之前阻止NSOperation?

问题描述:

我有一个数据加载操作,需要从主线程运行,以避免潜在的阻塞问题。为此,我使用NSOperationQueue和NSOperations。如何在NSOperationQueue完成之前阻止NSOperation?

然而,出现的一个问题是,其中一个操作存在根据传入信息产生附加操作。试图解决这个问题也解决了我在别处遇到的一些小问题,因为我碰到的解决方案是给NSOperation它是自己的子任务队列。

问题是,只要'main'退出,NSOperation将被标记为'finished',而不管子队列是否已经完成处理;我如何覆盖这种行为?

+0

听起来像你正在寻找[并发'NSOperation'](http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/NSOperation_class/Reference/Reference.html)? – 2013-05-10 03:00:34

+0

@CarlVeazey不......确切地说,但它看起来像用于创建一个并发NSOperation的步骤做同样的事情,我实际上在寻找。你必须重写启动方法如何处理isFinished/isExecuting,我认为这正是我需要在这里做的。我需要覆盖启动,因此它不会设置isFinished即时主要目的。这意味着当我改变这些属性时,处理KVO的东西,哦,快乐。 – RonLugge 2013-05-10 03:11:42

+0

@CodaFi我不确定自己是否清楚自己,但你提出的答案似乎没有道理。依赖性阻止了一个操作的执行,它不会阻止它在开始执行时完成。至少,这就是参考文献所说的。 – RonLugge 2013-05-10 03:53:24

在退出操作主方法之前,您可以发送waitUntilAllOperationsAreFinished消息到您的子队列。这很容易,但不是一个好主意,因为它阻止了整个线程,而这非常浪费。

更好的解决方案是使用依赖系统。创建与您的主要操作有关的另一个操作。创建子操作之后,还可以将它们作为依赖项添加到新的“精加工”操作中。

只要“主”退出,的NSOperation将被标记为“完成”,

这个逻辑在[NSOperation start]实现的,所以你只要用您的定制逻辑来覆盖它:调用main,它产生一些额外的操作,在完成操作后设置状态isFinished