Objective c 终止cocoa应用程序中的所有方法并重新初始化

Objective c 终止cocoa应用程序中的所有方法并重新初始化,objective-c,cocoa,Objective C,Cocoa,我想终止所有当前调用的方法,然后简单地重新初始化当前对象。 所以当用户点击开始按钮时,我会调用一系列方法…开始做一些事情。然后,当用户单击Cancel时,我需要停止所有正在运行的任务/方法并重新初始化 我不希望应用程序本身终止。因此无法使用[NSApp terminate:nil]。我只需要停止所有当前函数,然后调用[self init]; 提前感谢。首先,您必须设置一些标志并禁用用户界面,直到完成所有方法。例如,self.cancelled=YES 接下来,如果设置了该标志,则应调整每个方法以

我想终止所有当前调用的方法,然后简单地重新初始化当前对象。 所以当用户点击开始按钮时,我会调用一系列方法…开始做一些事情。然后,当用户单击Cancel时,我需要停止所有正在运行的任务/方法并重新初始化

我不希望应用程序本身终止。因此无法使用[NSApp terminate:nil]。我只需要停止所有当前函数,然后调用[self init];
提前感谢。

首先,您必须设置一些标志并禁用用户界面,直到完成所有方法。例如,
self.cancelled=YES

接下来,如果设置了该标志,则应调整每个方法以返回:

- (void)doSomething
{
    if (self.cancelled) return;
    // ...
    for (/* ... */) {
        // ...
        if (self.cancelled) return;
        // ...
    }
    // etc...

}
然后,您需要一种机制来跟踪所有方法。您很可能会使用
NSOperationQueue
dispatch\u queue\t
。查看文档,了解如何在队列变空时获取通知


最后,重置
self.cancelled
标志并取消阻止用户界面。

但是如果我在每个方法中都这样做,并且代码通过检查,然后用户点击cancel,那么我该如何处理它?我可以想出一些方法来处理这件事,但不会很干净。我希望有其他简单的方法让一切重新初始化,而不是关闭应用程序窗口。我可能会误解,但看起来你想做一些可撤销的事情:)不幸的是,没有办法“中断”方法执行。如果您不想重新启动应用程序,则当设置了某些标志或满足某些条件时,您的代码必须有返回的方法。总体而言,始终可见并启用“取消”按钮不是很好的用户体验。您不需要将取消逻辑添加到应用程序的每个方法中。通常,“取消”按钮只中断一个操作,不管它有多复杂。因此,只有该操作才应该支持“取消”。采用NSOperationQueue是一个好主意,因为另一个原因:它的设计提供了一种非常明显的、当然非常简单的方法来创建可取消的操作。您将工作分解为不可分割的块,每个块由一个NSO操作建模。当用户取消时,您将取消队列中已经存在的所有操作。任何已经运行的块都将完成(正如它们应该完成的那样),其余的块将不会启动。