我设计了一个有时需要进行密集计算(在循环内)的应用程序,它会在十分之几秒内大量加载 cpu。我启动一个 UIAlertView 来显示一条消息,例如:“请等待几秒钟”。 我的问题是,在此期间,应用程序根本没有响应,用户无法关闭 UIAlertView 本身。这不是主要问题,但对用户不公平。但如果我要实现某种取消按钮,它可能会成为一个真正的问题。 我该如何解决这个问题?例如,当检测到过多的 CPU 负载时,我可以在我的计算循环中使用一些 sleep 命令吗? 谢谢。
最佳答案
您不应在主线程上执行 CPU 密集型操作 - 正如您所见,这会影响应用的响应能力。您可以使用 dispatch队列在另一个线程上执行任务。
我链接到的 Apple 指南中有更多详细信息,但通常您可以使用类似 -
dispatch_queue_t aQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_async(aQueue, ^{
[self performIntensiveTask];
});
如有必要,您可能需要知道您的密集任务何时完成。您可以使用 NSNotification
来执行此操作,或者您可以只更新您的 UI 元素 - 如果您选择第二种,请注意您应该只在主线程上更新 UI 元素,这样您就可以 -
dispatch_queue_t aQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_async(aQueue, ^{
[self performIntensiveTask];
dispatch_async(dispatch_get_main_queue(), ^{
[self updateUI];
});
});
关于iOS : device is hanging while running an intensive computing task,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24214190/