2011-12-21 83 views
0

什么可能导致应用程序停止对接口事件正确响应?我面临的一个问题是,我的应用停止做各种动画,例如,键盘不动画,它只出现在屏幕上。设备的旋转不是动画的,它只是旋转而没有动画。 UIAlertView显示和解散没有动画。iPad应用程序停止响应接口事件正确

我正在开发一个高性能的应用程序,每秒创建和释放几个对象。我尽量使用尽可能少的内存。我所描述的这个问题并不是由内存警告引起的,我没有捕获任何异常(我将它们全部记录下来)。

如果任何人都可以给我任何建议,我会很感激。

Obs .:还有一件事我很好奇:在我的应用程序中,当我遇到这个问题时,uiview动画停止发生。但CALayer动画正常执行。有没有解释呢?

回答

1

听起来好像你正在做一些阻止主线程的操作。所有用户界面都在主线程上完成,所以如果你在那里做了一些长时间的计算,这会导致用户界面停止响应。你在做同步网址请求吗?再次,这将阻止主线程。

你应该尽可能多的非UI代码移到后台线程尽可能......做到这一点无论是使用GCD或NSOperations

看看苹果的​​3210。

苹果采取的NSThreads ...

* ...从线移开可能不会在所有情况下是可能的,性能(和你的代码的简洁性)可以显着的地方改善地方,你做开关。具体来说,而是使用线程的调度队列和操作队列有以下几个优点:

  • 这可以减少内存惩罚你的应用程序支付用于存储应用程序的内存空间线程堆栈。
  • 它消除了创建和配置线程所需的代码。
  • 它消除了管理和调度线程工作所需的代码。
  • 它简化了您必须编写的代码。

另外,请参阅NSThread与NSOperationQueue上的this question

+0

好的,我会看看。我有一些在后台运行的线程来处理数据流,我打几个Web服务。 Web服务我执行异步和流使用NSThread。 NSOperations比NSThread有更好的性能?另一件事:如果主线程被阻止,它不应该冻结应用程序?这里是一个视频链接显示我的问题:[链接] http://www.youtube.com/watch?v=eFOpPofnSnw&feature=youtu.be – Leonardo 2011-12-21 16:09:26

+0

还有一件事我很好奇:在我的应用程序中,当我有这个问题,uiview动画停止发生。但CALayer漫反射正常发生。有没有解释呢? – Leonardo 2011-12-21 19:03:40

0

您可能会通过长时间运行阻塞主线程。你在代码中的某处进行轮询或循环?如果你这样做(你不应该这样做),确保你在后台线程上执行它。

0

CALayer转换更新可以具有比主线程更高的优先级,因此即使主UI线程被阻塞也可以看到CALayer转换更新。但是,只要主线程被阻塞,就不会发生UI更新。 UI对象将在您阻止主线程的期间被冻结。

如果您希望UI动画流畅,您的应用必须经常从所有主线程处理返回到UI运行循环(可能每秒至少30次?)。

+0

你如何区分ui主线程处理中的主线程处理?我从来没有做过这样的区分......当你说每秒至少30次时,有可能控制它? – Leonardo 2011-12-22 11:17:09

+0

在iOS应用程序中,主线程也是UI线程。任何不能快速完成的事情(几十毫秒)都应该在另一个线程上完成,或者是异步完成。 – hotpaw2 2011-12-23 20:36:31