如何在不被看门狗杀害的情况下进行冗长的操作?苹果手机

时间:2011-12-16 15:16:47

标签: ios kill

我有一个很少执行的重要操作。在某些情况下,执行可能需要几分钟。我的应用程序在50秒操作后被杀死。怎么避免呢?

我应该把它放在后台线程中吗?谁能请我指出正确的方向。我没有找到任何关于所谓看门狗的有用信息。背景线程是要走的路吗?

2 个答案:

答案 0 :(得分:8)

是的,您需要将此任务移至后台线程。你永远不应该用任何花费超过几分之一秒的任务来阻塞主线程。忽略只在极端条件下启动的看门狗定时器,您的应用程序在此长时间操作期间对触摸或其他事件完全没有响应,并且您无法向用户提供有关此操作进展的反馈。

看门狗定时器会杀死一个长时间阻塞主线程的应用程序,使应用程序无法响应输入(我相信这个持续时间目前在启动时为20秒,但我不确定它是什么适用于应用程序运行时)。你永远不应该让你的应用程序达到监视程序杀死它的程度,因为这表明应用程序处理事物的方式存在真正的问题。

将长时间运行的任务移动到后台线程本身就是一个冗长的主题,这就是为什么我建议在开始之前阅读Apple的Concurrency Programming Guide (updated)以及观看一些关于该主题的WWDC视频。

但是,在我看来,处理长期运行任务的最优雅的方法是使用Grand Central Dispatch,其中包括

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    // Do your long-running task here

    dispatch_async(dispatch_get_main_queue(), ^{
           // Do callbacks to any UI updates here, like for a status indicator
    });
});

将触发您在其中一个全局并发队列的后台线程中执行的任务。主块中的一小部分代码显示了如何在此后台任务中更新任何UI元素,例如进度条。通常,UI更新必须在主线程上执行(从iOS 4.0开始有一些例外,但它仍然是一个很好的做法)。

我还强烈建议在此过程中添加某种长期运行状态的视觉指示。您的用户会非常欣赏这一点,它会使您的应用程序看起来更快,即使它可能运行相同的持续时间。

答案 1 :(得分:0)

在您的过程中,您偶尔会遇到看门狗吗?看门狗定时器只是检测是否有什么东西崩溃了。他们并不真正关心系统忙碌。

手机是否仍然能够响应用户在处理过程中按下主页按钮等操作?

编辑:这家伙建议using a background thread