如何确定主线程上运行的内容 + 减慢 UI 速度?

问题描述 投票:0回答:2

我在我的应用程序中添加了新的数据加载功能。它的目的是将大型数据库的内容从移动设备传输到后端并进行处理。在我在此管道中运行的每个函数中,该函数的全部内容都在

dispatch_async

这会分派到非主线程。我还通过日志验证了这些功能是否有效。管道中的每个函数都脱离主线程。但我却遇到了 UI 冻结的情况。

问题:

  1. 弄清楚主线程上有什么以及它正在做什么/等待什么的最佳方法是什么?
  2. 是否有可能让非主线程执行如此多的操作而实际上影响主线程?
ios objective-c
2个回答
8
投票

您应该使用 Instruments 分析您的应用程序。 “时间分析器”(确保使用“记录等待线程”选项)可能很有用,“系统跟踪”也是如此。对于两者,您可能需要使用“线程策略”视图,enter image description here,重点关注主线程。 “Hangs”工具也非常有用(特别是如果您降低阈值)。有很多 WWDC 视频描述了各种方法。例如,请参阅分析与仪器一起挂起。有许多乐器视频

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

顺便问一下,你百分百确定主线程真的没有响应吗?或者您是否可能只是没有看到 UI 更新及时得到反映?这可能是由于意外地从后台线程进行 UI 更新而不是将它们分派回主队列造成的。

如果您想要更具体的建议,我们需要性能问题的“可重现的示例”。但抽象地说,

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

0
投票

© www.soinside.com 2019 - 2024. All rights reserved.