我的主线程上有一个 NSOperationQueue,它运行一组我希望能够随时取消的 NSOperations(最大并发设置为 1)。当我按下一个按钮时,我告诉队列取消所有操作并等到完成。这应该挂起主线程,直到操作队列为空,但是它无限期地挂起我的主线程。
这是我用来阻止它的代码:
...
[myQueue cancelAllOperations];
[myQueue waitUntilAllOperationsAreFinished];
return YES; // This line never gets called
注意:我需要使用waitUntilAllOperationsAreFinished
,因为进一步的流程要求队列为空。
奇怪的是,这只发生在设备上。在模拟器中运行时,它按预期工作。
我已经观察了断点,我可以跟踪当前正在运行的操作,直到它完成。它检测到 [self isCancelled],停止它正在做的事情,然后一直运行到main
方法的末尾。我可以看到操作中没有任何内容导致它挂起,并且通过取消所有操作,其他操作都不应该开始,队列应该完成。我已经通过添加断点进行了检查,并且没有其他操作开始。
为什么会这样?