我的主线程上有一个 NSOperationQueue 运行一组 NSOperations(最大并发设置为 1),我希望能够随时取消。当我按下按钮时,我告诉队列取消所有操作并等待完成。这应该挂起主线程,直到操作队列为空,但是它无限期地挂起我的主线程。
这是我用来阻止它的代码:
...
[myQueue cancelAllOperations];
[myQueue waitUntilAllOperationsAreFinished];
return YES; // This line never gets called
注意: 我需要使用
waitUntilAllOperationsAreFinished
因为进一步的进程要求队列为空。奇怪的是这仅发生在设备上。在模拟器中运行时,它按预期工作。
我已经观察了断点,我可以跟踪当前正在运行的操作,直到它完成。它检测 [self isCancelled],停止它正在做的事情并快速到达
main
方法的末尾。我可以看到操作中没有任何内容导致它挂起,并且通过取消所有操作,其他操作都不应该开始,队列应该结束。我通过添加断点进行了检查,并且没有其他操作开始。为什么会这样?
最佳答案
在您的任何操作(或任何其他线程)中,您是否使用 -performSelectorOnMainThread:withObject:waitUntilDone:
? -waitUntilAllOperationsAreFinished
将阻塞它调用的任何线程,直到所有操作完成。很可能,如果您在应用程序终止时调用它,则该线程将是主线程。如果主线程被阻塞,并且其中一个操作使用 -performSelectorOnMainThread:withObject:waitUntilDone:
,您的应用程序将卡住,因为该操作永远不会完成。
我以前也遇到过这种情况。不幸的是,这很难解决。
关于iphone - 主线程在等待 NSOperationQueue 操作取消时无限期挂起 [仅在设备上!],我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1911211/