如何确定在主线程上运行的内容+减慢用户界面的速度?

时间:2016-08-09 20:59:02

标签: ios objective-c

我在我的应用中添加了新的数据加载功能。它意味着将大型数据库的内容从移动设备传输和处理到后端。在我在这个管道中运行的函数中,函数的全部内容都在

dispatch_async

这将调度到非主线程。我还验证了这些正在运行的日志。管道中的每个功能都不在主线程中。然而,我正在经历用户界面冻结。

问题:

  1. 找出主线程上的内容以及它正在做什么/等待的最佳方法是什么?
  2. 是否有可能让非主线程做得如此之多,它实际上会影响主线程?

2 个答案:

答案 0 :(得分:4)

您应该使用乐器配置您的应用。 Time Profiler(确保使用“Record Waiting Threads”选项)可能很有用,系统跟踪也是如此。对于这两者,您可能希望使用“线程策略”视图enter image description here,重点关注主线程。有一堆WWDC视频描述了各种方法,包括过时的,但仍然相关的2012年视频Building Concurrent User Interfaces on iOS。还要寻找引用“分析”和“乐器”的较新的WWDC视频。

对于非主线程对性能产生负面影响,它通常可以忽略不计,您可能还有其他事情要发生。唯一一次这是一个重大问题是当你使用一个不支持多线程的非常旧的设备时。

顺便问一下,您是否100%确定主线程确实没有响应?或者您可能没有及时看到UI更新?这可能是因为意外地从后台线程进行UI更新而不是将它们分派回主队列。

如果您需要更具体的建议,我们需要reproducible example性能问题。但在摘要中,

  • 确保您在主队列上没有任何耗时的操作;
  • 确保将所有UI更新分派回主队列...这包括可能触发UIKit控件更新的任何;
  • 确保您的代码不会“等待”来自主线程的任何内容(例如,等待信号量,等待操作队列上的操作,等待调度组等);和
  • 请记住,并非所有异步API都会在后台队列上调用它们的完成处理程序(实际上,为了方便起见,许多异步API会将其调回主队列),所以如果你在完成时花费了很多时间处理程序,确认它实际上是在后台线程上运行。

答案 1 :(得分:0)

我会使用这些工具,你可以使用很多工具,例如Time Profiler,Allocations,System Usage等。要打开工具,请在xcode或Xcode中使用命令+ i>打开开发人员工具>工具在xcode菜单中。