我正在使用NSOperationQueue
的子类,该子类NSOperation
在我的应用程序中会生成大量数据,因此计算量很大。
当用户关闭该应用程序时processingQueue.cancelAllOperations()
。同样在我的NSOperation
子类中,我重写cancel()
以让它向执行实际繁重任务的类转发取消请求...
override func cancel() {
AppDelegate.instance.cancelDataGeneration()
super.cancel()
}
但这还不够。当我在数据生成过程中关闭应用程序时,它将在Xcode中崩溃。
如何防止崩溃(可能导致数据丢失)?是否可以让应用等待关闭,直到所有并发操作都被取消,这样做如何(如果可能的话)?或通常使用什么其他方法来解决此问题?
更新:
更多的调查后,我发现,cancel()
我的NSOperation
子类不会被调用,甚至称后processingQueue.cancelAllOperations()
在applicationShouldTerminate
。因此,我添加了一种方法来手动调用cancel:
func cancelDataGeneration() {
if let op = AppDelegate.instance._operation {
op.cancel();
}
}
而且我从内部调用它applicationShouldTerminate
(因为applicationShouldTerminate
早于调用applicationWillTerminate
。有趣的是,由于我的AppDelegate是Singleton,因此我必须使用AppDelegate.instance._operation
。如果仅检查_operation
它是否导致从被nil
调用applicationShouldTerminate
。知道为什么会这样很有趣。
在任何情况下,取消操作现在都可以正常工作:退出应用程序后,它将取消数据生成类并退出而不会崩溃...大部分情况下都不会崩溃。但是我仍然想知道为什么我在使用时没有调用我的NSOperation
子类!cancel()
processingQueue.cancelAllOperations()
摘自Apple文档。
取消操作不会自动将其从队列中删除,也不会停止当前正在执行的操作。对于排队等待执行的操作,队列在识别出已取消并将其移至完成状态之前,仍必须尝试执行该操作。
我将阻止该应用程序的主线程,直到NSOperationQueue完成其所有工作。
[NSOperationQueue cancelAllOperations]
第一。现在,如果您blocking
对当前执行的块完成之前的主线程不满意,则需要检查一个标志(或NSApplicationDelegate
可以在该类上设置一个标志),该标志表示应用程序是否仍处于活动状态才能继续。如果要终止应用程序,那么fall out
在块中voluntarily
,这是最干净的方法。
大致类似于以下内容。
void ^(aBlock)(void) = ^void(void)
{
for(NSUInteger i = 0;i < 1000; i++)
{
// heavy processing code. Taking several iterations each second
// At the start of each iteration, check for a flag, to see if to quit
if(_applicationIsShuttingDown) break;
// perform block operation
}
};
并且您的类是NSApplicationDelegate并实现
-applicationWillTerminate:(NSNotification *)aNotification
{
_applicationIsShuttingDown = YES;
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句