0

当应用程序发送到后台时,我想取消长时间运行的计算方法并关闭 ViewController。

详细信息:在 MainViewController 中的按钮操作后,会显示一个新的 ResultViewController,并在 ViewDidLoad 方法中启动一个长时间运行的计算方法。计算方法在主线程上运行,完全没问题。

对于应用程序进入后台的情况,我想防止应用程序由于未完成的计算方法而被杀死。我设置了可以在 ResultViewController 中使用的 applicatinDidEnterBackground 通知,但我不知道如何取消正在运行的计算方法并关闭 ResultViewController。

谢谢。

4

1 回答 1

3

并在 ViewDidLoad 方法中启动一个长时间运行的计算方法。计算方法在主线程上运行,完全没问题。

老实说,我怀疑这可以被贴上“好”的标签。

正确的解决方案是将这些计算移动到后台线程并异步执行它们。

如果您阻塞主线程太久(就像在这种情况下),那么您甚至不会知道应用程序将被置于后台 - 应用程序的主队列不会处理有关通知,因为您消耗了所有它的资源。Watchdog 只会杀死您的应用程序,因为它无法applicatinDidEnterBackground在合理的时间内(大约 7-8 秒)处理通知。


编辑(回应评论中的问题)

您可能想查看如何实现NSOperation以及如何使用NSOperationQueue. 好的资源是例如这个站点。

我要告诉你的是大致了解取消操作是如何工作的——尤其是isCancelled属性的使用,它在操作的关键部分进行检查(并用于停止计算)。你不必在你的情况下实现 NSOperation (除非你想要 - 这可能是一个很好的练习;-))但是如果你创建一些正在处理数据的类,并且你添加了一个类似的方法cancel,那么你可以模仿NSOperation's代码中的行为。

于 2013-08-18T12:48:20.130 回答