完成处理程序闭包是否始终在后台线程中运行?

2023-12-30

完成处理程序闭包在 iOS 开发中很常见,例如dataTask(with:completionHandler:) in the URL会话 class.

UI 引擎由主线程管理,URLSession 的 API 调用在后台线程下运行,如果处理程序中需要更新 UI,则必须将其分派到主线程。

问题1: iOS 框架中的所有完成处理程序闭包是否都在后台线程中运行?

问题1.1: 例如,由开发人员创建的所有转义闭包是否都在后台线程中运行?

问题2: 我在 iPhone X 模拟器中看到最多 8 个线程。 ios中哪个是主线程,哪个是后台线程?他们有不同的优先级和计算能力吗?


请记住,您真正询问的是队列和线程,而不是完成处理程序和闭包。任何类型的代码都在队列(由一个或多个线程组成)上执行。在这方面,完成处理程序闭包没有什么特别的。

Q1 - 大多数 iOS SDK 提供的完成处理程序都是在后台队列上调用的,但除非文档明确说明在哪个队列上调用,否则不要做出这种假设。甚至URLSession可以配置为在特定队列上运行,包括主队列。

Q1.1 - 您编写的闭包将在您调用它们的任何队列上运行。没有什么魔法能让它们在后台队列上运行。

Q2 - 第一个线程始终是主队列中的唯一线程。所有其他线程都来自后台队列。每个线程可以具有基于其队列属性赋予的任何优先级。

您应该查看Dispatch https://developer.apple.com/documentation/dispatch有关更多详细信息的文档,特别是DispatchQueue.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

完成处理程序闭包是否始终在后台线程中运行? 的相关文章

随机推荐