首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何确定主线程上运行的内容+减慢UI?

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

Stack Overflow用户
提问于 2016-08-09 20:59:02
回答 2查看 3.7K关注 0票数 7

我在我的应用程序中添加了一个新的数据加载功能。它的目的是将大型数据库的内容从移动设备传输到后端。在我在这个管道中运行的任何函数中,函数的整个内容都在

代码语言:javascript
复制
dispatch_async

这将分派到一个非主线程。我还用日志验证了这些日志是否有效。管道上的每一个功能都与主线程无关。然而,我正在经历UI冻结。

问题:

  1. 找出主线程上有什么以及它在做什么/等待什么是最好的方法?
  2. 有可能让非主线程做这么多事情,实际上会影响主线程吗?
EN

回答 2

Stack Overflow用户

发布于 2016-08-09 22:30:41

你应该用仪器分析你的应用程序。时间分析器(确保使用“记录等待线程”选项)是有用的,系统跟踪也是如此。对于这两种情况,您可能都希望使用“线程策略”视图,

集中在主线程上。有一堆WWDC视频描述了各种方法,包括过时的,但仍然相关的,2012年视频在iOS上构建并发用户界面。还可以寻找新的WWDC视频,其中提到了“剖析”和“工具”。

对于影响性能的非主线程,它通常可以忽略不计,而且您可能还有其他的事情要做。唯一重要的问题是当你使用一个不支持多线程的非常老的设备时。

顺便问一下,你能百分之百确定主线程真的没有反应吗?或者,您可能只是没有看到UI更新得到及时的反映吗?这可能是意外地从后台线程执行UI更新的结果,而不是将它们发送回主队列。

如果你想要更具体的建议,我们需要一个可复制示例的性能问题。但从抽象意义上讲,

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

Stack Overflow用户

发布于 2016-08-09 21:09:05

我会使用这些工具,你可以使用很多工具,比如时间分析器、分配、系统使用等等。在xcode菜单中打开工具使用command+i或Xcode>Open Developer Tools>Instruments。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38860310

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档