完成处理程序关闭在ios开发中很常见。例如 URLSession 类中的dataTask(with:completionHandler:)
。
UI引擎由主线程管理,URLSession的API调用在后台线程下运行,如果处理程序中需要UI更新,则需要将其分派到主线程。
问题1 : ios框架中的所有完成处理程序闭包是否都在后台线程中运行?
问题1.1 : 例如,由开发人员创建的所有转义闭包是否都在后台线程中运行?
问题2 : 我在iPhone X模拟器中看到多达8个线程。 ios中的哪个是主线程,哪个是后台线程?它们具有不同的优先级和计算能力吗?
答案 0 :(得分:6)
请记住,与完成处理程序和闭包相比,您真正询问的是队列和线程。任何类型的代码都在队列(由一个或多个线程组成)上执行。在这方面,完成处理程序关闭没有什么特别的。
Q1-大多数iOS SDK提供的完成处理程序是在后台队列上调用的,但除非文档中特别说明要调用的队列,否则不要做此假设。甚至URLSession
都可以配置为在特定队列(包括主队列)上运行。
Q1.1-您编写的闭包可以在调用它们的任何队列上运行。没有任何魔法可以使它们在后台队列上运行。
Q2-第一个线程始终是主队列中的唯一线程。所有其他线程均来自后台队列。每个线程可以具有根据其队列的属性指定的优先级。
您应该查看Dispatch文档以了解更多详细信息,尤其是DispatchQueue
。