【问题标题】:iPad App Stops Responding to Interface Events CorrectlyiPad App 停止正确响应接口事件
【发布时间】:2011-12-21 15:01:52
【问题描述】:

什么可能导致应用停止正确响应界面事件?我面临的一个问题是我的应用程序停止执行各种动画,例如,键盘没有动画,它只是出现在屏幕上。设备的旋转不是动画的,它只是在没有动画的情况下旋转。 UIAlertView 在没有动画的情况下显示和关闭。

我正在开发一个每秒创建和释放多个对象的高性能应用程序。我尝试使用尽可能少的内存。我正在描述的这个问题之前没有内存警告,并且我没有捕获任何异常(我记录了所有异常)。

如果有人能给我任何建议,我将不胜感激。

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

【问题讨论】:

    标签: iphone objective-c ipad


    【解决方案1】:

    听起来好像您正在执行一些阻塞主线程的操作。所有 UI 都在主线程上完成,因此如果您还在主线程上进行一些长时间的计算,这将导致 UI 停止响应。你在做同步 url 请求吗?同样,这将阻塞主线程。

    您应该将尽可能多的非 UI 代码移至后台线程...使用 GCD 或 NSOperations 执行此操作

    看看苹果的Concurrency Programming Guide

    Apple 对 NSThreads 的看法...

    *...在所有情况下都可能无法摆脱线程,但在您进行切换的地方,性能(以及代码的简单性)可以显着提高。具体来说,使用调度队列和操作队列代替线程有几个优点:

    • 它减少了您的应用程序为在应用程序的内存空间中存储线程堆栈而支付的内存损失。
    • 它消除了创建和配置线程所需的代码。
    • 它消除了管理和安排线程工作所需的代码。
    • 它简化了您必须编写的代码。

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

    【讨论】:

    • 好的,我去看看。我有一些在后台运行的线程来处理数据流,我调用了几个 Web 服务。我执行异步的 Web 服务和我使用 NSThread 的流式传输。 NSOperations 的性能比 NSThread 好?另一件事:如果主线程被阻塞,它不应该冻结应用程序吗?这是显示我的问题的视频链接:[link]youtube.com/watch?v=eFOpPofnSnw&feature=youtu.be
    • 还有一件事我很好奇:在我的应用程序中,当我遇到这个问题时,uiview 动画停止发生。但是 CALayer 动画正常发生。有解释吗?
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

      • 主线程处理和ui主线程处理有什么区别?我从来没有做过这种区分......当你说每秒至少 30 次时,有可能控制它吗?
      • 在 iOS 应用中,主线程也是 UI 线程。任何不能快速完成的事情(几十毫秒)都应该在另一个线程上完成,或者异步完成。
      猜你喜欢
      • 2012-08-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多