我有一个很少执行的重要操作.在某些情况下,执行可能需要几分钟.我的应用程序在50秒操作后被杀死.怎么避免呢?
我应该把它放在后台线程中吗?谁能请我指出正确的方向.我没有找到任何关于所谓看门狗的有用信息.是后台线程的方式吗?
是的,您需要将此任务移动到后台线程.你永远不应该用任何花费超过几分之一秒的任务来阻塞主线程.忽略只在极端条件下启动的看门狗定时器,您的应用程序在此长时间操作期间对触摸或其他事件完全没有响应,并且您无法向用户提供有关此操作进展的反馈.
看门狗定时器会杀死一个在很长一段时间内阻塞主线程的应用程序,使应用程序对输入没有响应(我相信这个持续时间目前在启动时是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开始有一些例外,但它仍然是一个很好的做法).
我还强烈建议在此过程中添加某种长期运行状态的视觉指示.您的用户将非常欣赏这一点,它会使您的应用程序看起来更快,即使它可能运行相同的持续时间.
| 归档时间: |
|
| 查看次数: |
3552 次 |
| 最近记录: |