我在我的应用程序中添加了新的数据加载功能。它的目的是将大型数据库的内容从移动设备传输到后端并进行处理。在我在此管道中运行的每个函数中,该函数的全部内容都在一个
dispatch_async
这会分派到非主线程。我还通过日志验证了这些功能是否有效。管道中的每个函数都脱离主线程。但我却遇到了 UI 冻结的情况。
问题:
- 弄清楚主线程上有什么以及它正在做什么/等待什么的最佳方法是什么?
- 是否有可能让非主线程执行如此多的操作而实际上影响主线程?
You should profile your app with Instruments. Time Profiler (make sure to use "Record Waiting Threads" option) can be useful, as is System Trace. For both, you might want to use the "Thread Strategy" view, , focusing on the main thread. There are a bunch of WWDC videos that describe various approaches, including the dated, yet still relevant, 2012 video Building Concurrent User Interfaces on iOS https://developer.apple.com/videos/play/wwdc2012/211/. Also look for newer WWDC videos that reference "profiling" and "instruments".
关于非主线程对性能的不利影响,它通常可以忽略不计,并且您可能还有其他事情发生。唯一一个严重的问题是当您使用不支持多线程的非常旧的设备时。
顺便问一下,你百分百确定主线程真的没有响应吗?或者您是否可能只是没有看到 UI 更新及时得到反映?这可能是由于意外地从后台线程执行 UI 更新而不是将其分派回主队列造成的。
如果您需要更具体的建议,我们需要可重现的例子 https://stackoverflow.com/help/mcve的性能问题。但抽象地说,
- 确保主队列上没有任何耗时的操作;
- 确保所有 UI 更新都分派回主队列...这包括anything这可能会触发 UIKit 控件的更新;
- 确保您的代码不会“等待”主线程中的任何内容(例如等待信号量、等待操作队列上的操作、等待调度组等);和
- 请记住,并非所有异步 API 都会在后台队列上调用其完成处理程序(事实上,为了便于使用,许多将其分派回主队列),因此,如果您在完成处理程序中执行任何耗时的操作,请确认它实际上是否在后台线程上运行。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)