gpt4 book ai didi

ios - 如何确定主线程上正在运行什么+减慢用户界面?

转载 作者:可可西里 更新时间:2023-11-01 05:40:19 31 4
gpt4 key购买 nike

我在我的应用中加入了一个新的数据加载功能。它旨在将大型数据库的内容从移动设备传输到后端并进行处理。在我在此管道中运行的所有函数中,函数的全部内容都在

dispatch_async

这分派(dispatch)到一个非主线程。我还用日志验证了这些正在工作。流水线中的每个函数都脱离了主线程。然而,我正在经历 UI 卡住。

问题:

  1. 找出主线程上有什么以及它正在做什么/正在等待什么的最佳方法是什么?
  2. 有没有可能让非主线程做太多事情而实际上影响了主线程?

最佳答案

您应该使用 Instruments 分析您的应用。 Time Profiler(确保使用“Record Waiting Threads”选项)和 System Trace 一样有用。对于两者,您可能希望使用“线程策略” View ,enter image description here ,专注于主线程。有很多 WWDC 视频描述了各种方法,包括过时但仍然相关的 2012 视频 Building Concurrent User Interfaces on iOS .还可以查找引用“分析”和“仪器”的较新 WWDC 视频。

关于对性能产生不利影响的非主线程,它通常可以忽略不计,您可能还有其他事情要做。只有当您使用的是不支持多线程的非常旧的设备时,才会成为严重问题。

顺便说一下,你能 100% 确定主线程真的没有响应吗?还是您只是没有及时看到 UI 更新?这可能是因为不小心从后台线程执行了 UI 更新,而不是将它们分派(dispatch)回主队列。

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

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

关于ios - 如何确定主线程上正在运行什么+减慢用户界面?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38860310/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com