我在我的应用程序中添加了新的数据加载功能。它的目的是将大型数据库的内容从移动设备传输到后端并进行处理。在我在此管道中运行的每个函数中,该函数的全部内容都在
中dispatch_async
这会分派到非主线程。我还通过日志验证了这些功能是否有效。管道中的每个函数都脱离主线程。但我却遇到了 UI 冻结的情况。
问题:
您应该使用 Instruments 分析您的应用程序。 “时间分析器”(确保使用“记录等待线程”选项)可能很有用,“系统跟踪”也是如此。对于两者,您可能需要使用“线程策略”视图,,重点关注主线程。 “Hangs”工具也非常有用(特别是如果您降低阈值)。有很多 WWDC 视频描述了各种方法。例如,请参阅分析与仪器一起挂起。有许多乐器视频。
关于非主线程对性能的不利影响,通常可以忽略不计,并且您可能还有其他事情发生。唯一一次这是一个严重的问题是当您使用不支持多线程的非常旧的设备时。
顺便问一下,你百分百确定主线程真的没有响应吗?或者您是否可能只是没有看到 UI 更新及时得到反映?这可能是由于意外地从后台线程进行 UI 更新而不是将它们分派回主队列造成的。
如果您想要更具体的建议,我们需要性能问题的“可重现的示例”。但抽象地说,
确保主队列上没有任何耗时的操作;