在iOS
中,我们有GCD
和Operation
来处理并发编程。
调查GCD
我们有QoS
类,它们很简单直接,这个问题是关于为什么DispatchQueue.main.async
通常用于异步 X Main Thread
中的任务。
因此,当我们通常处理UI
中的某些内容时,我们通常会使用该功能,因为这样可以防止应用程序产生任何不响应。
让我认为是在UIViewController
内编写通常在主线程中执行的代码吗?
,但也知道callback & completionHandler
通常在执行时没有指定它们所在的线程,而UI
从来没有遇到过问题!就是背景吗?
Swift如何处理此问题?我默认在什么线程上写而未指定任何内容?
答案 0 :(得分:0)
由于此处存在多个问题,让我们尝试一个接一个地回答它们。
为什么DispatchQueue.main.async通常用于异步X任务 在主线程中。
在提及直接答案之前,请确保您没有混淆的理解:
请记住,DispatchQueue.main
是 serial 队列。使用sync
或async
与确定队列的序列化或 currency 无关,它们表示如何处理任务。因此说DispatchQueue.main.async
意味着:
将任务发送到后立即将控制权返回到当前队列 在不同的队列上执行。它不会等到任务完成 完成。它不会阻塞队列。
引用自:Main Thread Checker(我建议对其进行检查。)
换句话说,async
的意思是:这将在主剧院上发生,并在完成后对其进行更新。这就是您所说的话:
因此,当我们通常在UI中处理更新时,我们通常会使用 该功能是因为可以防止任何反应 应用。
似乎很明智;使用sync
-代替async
-会阻塞主体。
让我觉得通常是在UIViewController内部编写代码 在主线程中执行?
首先:默认情况下,如果不指定哪个线程应该执行一段代码,它将成为主线程。但是,您的问题似乎并不明确,因为在UIViewController
中,我们可以通过指定它来调用不在主线程上执行的功能。
,但是也知道回调和completionHandler通常会执行 没有指定它们在哪个线程上,UI从来没有 问题!就是背景吗?
“知道回调函数和completionHandler通常在执行时没有指定它们在哪个线程上”。您必须指定它。一个很好的真实示例,实际上就是{{3}}的工作方式。
我认为在处理UIKit
中的内置方法(例如)返回完成处理程序的情况下,您会缺少这里的某些内容,我们看不到它包含类似{ {1}}在调用完成处理程序时;因此,如果您没有在DispatchQueue.main.async
内部的完成处理程序中执行代码,那么我们应该假定它为您处理了代码!这并不意味着它没有在某处实现。
另一个真实世界的例子Alamofire!打电话时
DispatchQueue.main.async
这就是为什么您可以在不遇到主线程上任何“挂起”问题的情况下调用它的原因;这并不意味着它没有得到处理,而是意味着它们可以为您处理,因此您不必担心。