使用并发时如何在退出时不使应用程序崩溃

羽毛球猫

我正在使用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()

lead_the_zeppelin

摘自Apple文档

取消操作不会自动将其从队列中删除,也不会停止当前正在执行的操作。对于排队等待执行的操作,队列在识别出已取消并将其移至完成状态之前,仍必须尝试执行该操作。

我将阻止该应用程序的主线程,直到NSOperationQueue完成其所有工作。

  • 我称之为[NSOperationQueue cancelAllOperations]第一。
  • 然后在“应用程序将终止”方法中,我将调用[NSOperationQueue waitUntilAllOperationsAreFinished]这将确保当前执行的块(所有其他排队的任务将被取消)在应用程序退出之前完成。

    现在,如果您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] 删除。

    编辑于
    0

    我来说两句

    0条评论
    登录后参与评论

    相关文章

    来自分类Dev

    JavaFx应用程序在退出时崩溃

    来自分类Dev

    如何在“主页”按钮单击时退出应用程序?

    来自分类Dev

    我的Android应用程序的gameLoop线程在退出时崩溃

    来自分类Dev

    使用SherlockFragmentActivity时应用程序崩溃

    来自分类Dev

    使用startActivityForResult时应用程序崩溃

    来自分类Dev

    使用 Intent 时应用程序崩溃

    来自分类Dev

    使用Visual Studio和Qt 5.3创建QML应用程序时退出时崩溃

    来自分类Dev

    退出时程序崩溃

    来自分类Dev

    C ++-如何在应用程序退出时执行命令?

    来自分类Dev

    如何在WPF应用程序退出时禁用剪贴板清除功能?

    来自分类Dev

    方法退出时如何使Spring Boot应用程序不死

    来自分类Dev

    应用程序强制退出时如何恢复下载?

    来自分类Dev

    Ligbdx-触摸按钮时如何退出应用程序?

    来自分类Dev

    应用程序退出时如何杀死dbus监视脚本?

    来自分类Dev

    将C ++函数与委托一起使用后,C#应用程序在退出时崩溃

    来自分类Dev

    如何在启动时捕获Flutter应用程序崩溃

    来自分类Dev

    当检测到AccessViolationException时如何强制应用程序崩溃

    来自分类Dev

    当检测到AccessViolationException时如何强制应用程序崩溃

    来自分类Dev

    单击按钮时如何阻止应用程序崩溃?

    来自分类Dev

    如何在“使用应用程序”时使应用程序具有定位服务选项?

    来自分类Dev

    Android:VerticalGridFragment导致应用程序在使用ErrorFragment时崩溃?

    来自分类Dev

    使用addView()时我的应用程序崩溃

    来自分类Dev

    使用setShadowLayer()时,应用程序仅在4.4.2中崩溃

    来自分类Dev

    当我使用SupportStreetViewPanoramaFragment时应用程序崩溃

    来自分类Dev

    使用Pyinstaller启动时Kivy应用程序崩溃

    来自分类Dev

    使用HttpUrlConnection断开连接时,应用程序崩溃

    来自分类Dev

    使用addView()时我的应用程序崩溃

    来自分类Dev

    在Android中使用gridview时应用程序崩溃

    来自分类Dev

    使用GoogleMaps时,应用程序因FragmentManager Replace崩溃

    Related 相关文章

    1. 1

      JavaFx应用程序在退出时崩溃

    2. 2

      如何在“主页”按钮单击时退出应用程序?

    3. 3

      我的Android应用程序的gameLoop线程在退出时崩溃

    4. 4

      使用SherlockFragmentActivity时应用程序崩溃

    5. 5

      使用startActivityForResult时应用程序崩溃

    6. 6

      使用 Intent 时应用程序崩溃

    7. 7

      使用Visual Studio和Qt 5.3创建QML应用程序时退出时崩溃

    8. 8

      退出时程序崩溃

    9. 9

      C ++-如何在应用程序退出时执行命令?

    10. 10

      如何在WPF应用程序退出时禁用剪贴板清除功能?

    11. 11

      方法退出时如何使Spring Boot应用程序不死

    12. 12

      应用程序强制退出时如何恢复下载?

    13. 13

      Ligbdx-触摸按钮时如何退出应用程序?

    14. 14

      应用程序退出时如何杀死dbus监视脚本?

    15. 15

      将C ++函数与委托一起使用后,C#应用程序在退出时崩溃

    16. 16

      如何在启动时捕获Flutter应用程序崩溃

    17. 17

      当检测到AccessViolationException时如何强制应用程序崩溃

    18. 18

      当检测到AccessViolationException时如何强制应用程序崩溃

    19. 19

      单击按钮时如何阻止应用程序崩溃?

    20. 20

      如何在“使用应用程序”时使应用程序具有定位服务选项?

    21. 21

      Android:VerticalGridFragment导致应用程序在使用ErrorFragment时崩溃?

    22. 22

      使用addView()时我的应用程序崩溃

    23. 23

      使用setShadowLayer()时,应用程序仅在4.4.2中崩溃

    24. 24

      当我使用SupportStreetViewPanoramaFragment时应用程序崩溃

    25. 25

      使用Pyinstaller启动时Kivy应用程序崩溃

    26. 26

      使用HttpUrlConnection断开连接时,应用程序崩溃

    27. 27

      使用addView()时我的应用程序崩溃

    28. 28

      在Android中使用gridview时应用程序崩溃

    29. 29

      使用GoogleMaps时,应用程序因FragmentManager Replace崩溃

    热门标签

    归档