【问题标题】:App stops receiving NSTimer selector callbacks during any UI scrolling operation应用程序在任何 UI 滚动操作期间停止接收 NSTimer 选择器回调
【发布时间】:2013-03-02 03:28:32
【问题描述】:

我在 NSTimer 触发的主窗口上绘制了一个 OpenGL 动画。如果我打开一个带有可滚动 UITableView 菜单的弹出窗口,动画会在滚动过程中冻结。一旦滚动动画停止,计时器回调就会重新开始。只有当用户主动尝试滚动时,主窗口才会停止更新。

Apple 的滚动动画似乎以某种方式阻止了主循环上的调度。这是真的吗?有办法解决吗?

如果可以的话,我真的不想引入多线程,因为这会成倍地增加我的代码的复杂性。

我还尝试使用 CADisplayLink 而不是 NSTimer 并且显示链接调用也被滚动动画阻止。

【问题讨论】:

  • Apple 的第一要务是 UI 响应能力,因此在这种情况下,UI 操作会阻塞代码的其他部分。您需要将计时器移至另一个线程。
  • 你必须用计时器做动画吗?为什么不使用 UIView animateWithDuration?
  • 它用于 OpenGL 绘图的动画,而不是视图。
  • UI 是线程#1,永远不应该被阻塞。在回答您的问题之前,您必须决定线程#1 上的内容:动画或滚动。您将不得不将其中一个移动到另一个线程。但请先做出决定,我们可以提供帮助。

标签: ios animation scroll nstimer cadisplaylink


【解决方案1】:

NSTimer 与运行循环和模式相关联。在事件跟踪期间,模式为UITrackingRunLoopMode。默认情况下,scheduledTimerWithTimeInterval 创建的计时器与NSDefaultRunLoopMode 一起添加,因此在跟踪期间不会触发。

[[NSRunLoop currentRunLoop] addTimer:yourTimer forMode:UITrackingRunLoopMode];

【讨论】:

    【解决方案2】:

    正如 bdesham 所回答的,“Apple 的第一要务是 UI 响应能力,因此在这种情况下,UI 操作会阻塞代码的其他部分。您需要将计时器移至另一个线程。”

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-10-02
      • 2010-09-28
      • 1970-01-01
      • 2014-01-26
      • 1970-01-01
      • 2013-06-19
      • 1970-01-01
      相关资源
      最近更新 更多