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

JOG*_*JOG 2 kill ios

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

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

Bra*_*son 8

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

看门狗定时器会杀死一个在很长一段时间内阻塞主线程的应用程序,使应用程序对输入没有响应(我相信这个持续时间目前在启动时是20秒,但我不确定它是什么时候应用程序正在运行).你永远不应该让你的应用程序达到看门狗杀死它的程度,因为这指的是应用程序处理事物的方式中的一个真正的问题.

将长时间运行的任务移动到后台线程本身就是一个冗长的主题,这就是为什么我建议阅读Apple的并发编程指南(更新)以及在开始之前观看一些关于该主题的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
    });
});
Run Code Online (Sandbox Code Playgroud)

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

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