我有一项重要的操作很少执行。在某些情况下,执行过程可能需要几分钟。经过50秒的操作,我的应用程序被杀死了。如何避免呢?
我应该把它放在后台线程中吗?任何人都可以在这里向我指出正确的方向。我尚未找到有关所谓的看门狗的任何有用信息。是后台线程走的路吗?
最佳答案
是的,您需要将此任务移至后台线程。您绝不应该执行任何耗时超过一秒钟的任务来阻塞主线程。忽略仅在极端条件下才启动的看门狗计时器,您的应用程序在此冗长的操作过程中对触摸或其他事件完全不响应,并且您无法向用户提供有关此操作进度的反馈。
看门狗定时器将杀死阻塞主线程的应用程序很长时间,从而使该应用程序对输入无响应(我相信此持续时间目前在启动时为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上有一些例外,但通常仍然是一个好习惯)。
我还强烈建议在此长期运行的任务进行时添加某种直观的状态指示。您的用户将对此非常感激,即使它运行相同的时间,它也可以使您的应用程序看起来更快。
关于ios - 如何进行长时间的操作而不被看门狗杀死?苹果手机,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8536176/