Cocoa applicationWillTerminate和dock,但希望取消此操作

Cocoa applicationWillTerminate和dock,但希望取消此操作,cocoa,macos,quit,Cocoa,Macos,Quit,我的应用程序中有一些单独的线程需要正确地删除。 如果用户在“文件”菜单中选择“退出”菜单项,我会抛出一个错误,上面写着。。。在退出之前,请停止你正在做的其他事情。但是,如果用户从mac上的应用程序坞中退出应用程序,应用程序就会退出,并最终崩溃,因为其他线程仍在尝试执行它们的操作,而没有被正确地拆除 我尝试了-应用程序应该终止:,但在使用app dock quit方法的情况下它不会触发。。。如果文件脏了。如果文档已保存,则正确弹出“我的对话框” 因此,我想真正的问题是:在我们发现文档仍然很忙之前,

我的应用程序中有一些单独的线程需要正确地删除。 如果用户在“文件”菜单中选择“退出”菜单项,我会抛出一个错误,上面写着。。。在退出之前,请停止你正在做的其他事情。但是,如果用户从mac上的应用程序坞中退出应用程序,应用程序就会退出,并最终崩溃,因为其他线程仍在尝试执行它们的操作,而没有被正确地拆除

我尝试了
-应用程序应该终止:
,但在使用app dock quit方法的情况下它不会触发。。。如果文件脏了。如果文档已保存,则正确弹出“我的对话框”

因此,我想真正的问题是:在我们发现文档仍然很忙之前,如何停止“do you want save your document”查询


感谢使用
-应用程序应终止:
在您的NSApplication委托中是正确的做法

然而,对于构建在Mac OS X 10.6及更高版本上的应用程序,您可能会遇到一种称为“突然终止”的功能。书中对它的描述相当直截了当

结果是,您的后台任务应防止突然终止:

- (void)longRunningTask {
    NSProcessInfo *processInfo = [NSProcessInfo processInfo];
    [processInfo disableSuddenTermination];

    // real task work

    [processInfo enableSuddenTermination];
}
这样,当您在应用程序繁忙时要求其退出时,应用程序将被适当地发送到
-terminate:
,这将反过来调用您的NSApplication委托的
-application-shouldtimate:
,这将允许您优雅地停止任务或要求用户取消任务


如果您在NSOperation或其子类中执行长时间运行的任务,最好只添加此支持,而不是单独将其添加到所有任务中。(无论任务如何停止,无论任务是完成还是取消,都不要忘记重新启用突然终止。)

在NSApplication委托中使用
-应用程序应终止:

然而,对于构建在Mac OS X 10.6及更高版本上的应用程序,您可能会遇到一种称为“突然终止”的功能。书中对它的描述相当直截了当

结果是,您的后台任务应防止突然终止:

- (void)longRunningTask {
    NSProcessInfo *processInfo = [NSProcessInfo processInfo];
    [processInfo disableSuddenTermination];

    // real task work

    [processInfo enableSuddenTermination];
}
这样,当您在应用程序繁忙时要求其退出时,应用程序将被适当地发送到
-terminate:
,这将反过来调用您的NSApplication委托的
-application-shouldtimate:
,这将允许您优雅地停止任务或要求用户取消任务


如果您在NSOperation或其子类中执行长时间运行的任务,最好只添加此支持,而不是单独将其添加到所有任务中。(无论任务如何停止,无论任务是完成还是取消,都不要忘记重新启用突然终止。)

上一篇StackOverflow文章可能会有帮助:


选择“退出”菜单项时,您可以覆盖默认事件处理程序。

前面的StackOverflow帖子可能会有帮助:

选择“退出”菜单项时,可以覆盖默认事件处理程序