当我们使用NSTimer时,一旦在提到的时间间隔后调用回调,UI是否会被阻塞?NSTImer事件会阻塞主线程吗?
4
A
回答
2
定时器与运行 环路一起工作。要有效地使用计时器,您应该知道 运行循环的运行方式 - 请参阅NSRunLoop和Threading 编程指南。
一旦计划在运行循环中, 定时器在指定的时间间隔触发 ,直到它失效。 A 非重复定时器在其触发后立即使其自身失效 。但是,对于重复计时器,您必须 通过调用其invalidate方法使自己的计时器对象 无效。 调用此方法请求从当前的 运行循环中删除定时器 ;因此,您应该始终调用 中的无效方法,该方法与安装了计时器的相同线程 一致。无效的定时器 立即禁用它,以便它没有 更长的时间影响运行循环。然后循环运行 删除并释放 计时器,或者在 无效方法返回之前,或者在稍后的某个点处,在某些 点。一旦无效,定时器 对象不能重复使用。
我相信NSTimer
不会阻塞UI线程。也看看这个以前的问题NSTimer and updating UI
8
这取决于。大多数时候,这不会是一个问题。
如果,但是,两者的满足下列标准时,一个NSTimer
将块UI线程:
- 定时器定于主线程的
NSRunLoop
。无论何时通过在主线程中调用NStimer的scheduledTimerWith...
类方法创建它,都将是这种情况。 - 该方法在计时器触发时调用,执行“冗长”任务。想到同步执行的提取/ url请求会想到...
相关问题
- 1. 在gui事件后阻塞主线程
- 2. 更新tableView不会阻塞主线程
- 3. NSTask阻塞主线程
- 4. NSoperationQueue阻塞主线程
- 5. 队列阻塞主线程
- 6. QMessageBox会阻塞Qt中整个主线程的运行吗?
- 7. 防止tcl线程被主事件循环阻塞
- 8. SFML窗口调整大小事件阻塞主线程
- 9. Thread.sleep()方法阻塞主UI线程
- 10. Vertx单元测试阻塞主线程
- 11. 更新GMSMarkers没有阻塞主线程
- 12. 子窗口阻塞主线程
- 13. MVC Ajax请求不阻塞主线程
- 14. 请问applicationDidBecomeActive:阻塞主线程?
- 15. 阻塞队列不阻塞线程?
- 16. 阻塞线程 - Java
- 17. Java线程阻塞
- 18. Java线程阻塞
- 19. MessageBeep线程阻塞
- 20. 关闭流阻塞线程吗?
- 21. 目标C:阻塞线程直到NSTimer完成(iOS)
- 22. 为什么NSTimer在另一个线程运行时被阻塞?
- 23. 如何使用异步事件管理线程阻塞和解除阻塞?
- 24. ExecutorService超时而不会阻塞主线程
- 25. 如何让CATiledLayer不会阻塞主线程
- 26. 是否会在Node.js中阻塞主线程?
- 27. 将线程阻塞转换为f中的非线程阻塞#
- 28. STA线程模式线程也会阻塞winform UI线程?
- 29. 其他线程会在CUDA中的代码中阻塞吗?
- 30. 线程处理事件被处理程序阻塞了?
为什么'scheduledTimerWith ...'方法会导致问题?我的计时器正在运行时遇到UI阻塞。我用这种方法创建了它,我没有意识到这会是一个问题。我的其他选择是什么?谢谢。 – user700774 2011-07-13 21:55:01
@ user700774这些方法不是问题。问题是timer-callback中_synchronously_发生的工作量:只要回调函数返回**,定时器触发的runloop将被阻塞。如果您的回调快速退出,则在主线程上安排定时器时,您将永远不会注意到这一点。但是,如果你在那里做了一些耗时的处理(只是使用'sleep(5);'来模拟一个极端情况)......如果是这样的话,只要做到这一点_asynchronously_ - 'NSOperationQueue'和GCD是你的朋友, 这里。 – danyowdee 2011-07-15 13:18:29