如何追踪阻塞主(UI)线程的调用?

Posted

技术标签:

【中文标题】如何追踪阻塞主(UI)线程的调用?【英文标题】:How to track down calls that are blocking the main (UI) thead? 【发布时间】:2012-12-06 16:56:12 【问题描述】:

我的 ios 应用存在一些性能问题。特别是,当用户在特定的 Core Data 支持的 UITableView 中选择一个项目时,在 UI 更新之前会有延迟。由于目前应用程序中的多线程非常少,我猜我正在某个地方进行方法调用,这会花费太长时间并阻塞 UI 线程。

单步执行代码并没有向我透露任何信息。 (也许是因为问题出在运行循环的另一次旅行中?不确定...我是一名可靠的 iOS 开发人员,但在调试和分析工具方面是新手。)

解决此类问题的最佳方法是什么?有什么方法可以单步执行或跟踪线程按顺序执行的操作以及每个调用需要多长时间,或者其他什么?

谢谢。

【问题讨论】:

【参考方案1】:

查看 Instruments 中的 Time Profiler。请参阅WWDC 2012 - Building Concurrent User Interfaces on iOS 以实际演示如何使用分析器来识别您可能希望放入后台队列以避免阻塞主队列的候选方法。

有关 Instruments 工具的基本描述,请参阅Instruments User Guide,但我认为 WWDC 视频是熟悉这种特殊工具 Time Profiler 的更有效方式。此外,如果您从未使用过并发 Core Data,您可能还想查看 Core Data Programming Guide 的 Concurrency with Core Data 部分。

【讨论】:

【参考方案2】:

我会支持Rob 所说的:在Instruments 中使用Time Profiler 会更容易找到您的应用程序的瓶颈是什么。 Rob 的所有参考资料都很好,特别是来自 WWDC 的参考资料。我还在mobile tuts 中遇到了这个tut,它涵盖了基础知识。

【讨论】:

以上是关于如何追踪阻塞主(UI)线程的调用?的主要内容,如果未能解决你的问题,请参考以下文章

当 Cocoa 应用程序中的主线程被阻塞时,UI 不会更新

UIImage initWithData:从异步调度中阻塞 UI 线程?

semaphore_wait_trap 阻塞 UI

从 ui-thread 显示窗口有时会阻塞主 ui-thread

如何在多个任务之后继续而不阻塞 UI 线程?

子线程怎么不阻塞主线程