在iOS
中,我们有GCD
和Operation
来处理并发编程。
看看我们GCD
QoS
类,它们简单明了,这个问题是关于为什么DispatchQueue.main.async
通常用于异步Main Thread
中的X任务。
因此,当我们通常处理UI
中的更新某些内容时,我们通常使用该函数,以防止应用程序的任何无响应。
让我觉得在UIViewController
内编写代码通常在主线程中执行吗?
但也知道callback & completionHandler
通常在没有指定它们所在的线程的情况下执行,而且UI
从来没有遇到过问题!! 所以它在后台?
Swift 如何处理这个问题? 默认情况下,我在哪个线程上写入而没有指定任何内容?
由于这里有不止一个问题,让我们尝试一一回答。
为什么 DispatchQueue.main.async 通常用于异步 X 任务 在主线程中。
在提到直接答案之前,请确保您没有混淆理解:
- 串行<===>并发。
- 同步<===>异步。
请记住,DispatchQueue.main
是串行队列。使用sync
或async
与确定队列的序列化或货币无关,而是它们指的是如何处理任务。因此,说DispatchQueue.main.async
意味着:
在将控制权返回到当前队列后立即将任务发送到 在不同的队列上执行。它不会等到任务完成 完成。它不会阻塞队列。
引自:https://stackoverflow.com/a/44324968/5501940(我建议检查一下。
换句话说,async
意味着:这将发生在主头上,并在完成后更新它。这就是你所说的:
因此,当我们通常处理更新 UI 中的某些内容时,我们通常使用 该功能,因为可以防止任何无响应 应用。
似乎很明智;使用sync
- 而不是async
- 将阻塞主。
让我觉得通常是在UIView控制器内编写代码 在主线程中执行?
首先:默认情况下,如果不指定哪个线程应该执行代码块,它将是主线程。但是,您的问题似乎并不具体,因为在UIViewController
中,我们可以通过指定来调用未在主线程上执行的功能。
但也知道回调和完成处理程序通常会执行 没有指定它们在哪个线程中,并且 UI 从未有过 问题所在!!所以它在背景上?
"知道回调和完成处理程序通常在不指定它们在哪个线程上执行"不!您必须指定它。一个很好的真实例子,实际上这就是主线程检查器的工作方式。
我相信您在这里缺少一些东西,当处理来自UIKit
的内置方法(例如)返回完成处理程序时,我们在调用完成处理程序时看不到它包含类似DispatchQueue.main.async
的东西;因此,如果您没有在DispatchQueue.main.async
内部的完成处理程序中执行代码,那么我们应该假设它为您处理它!这并不意味着它没有在某处实现。
另一个真实世界的例子,阿拉莫火!呼叫时
Alamofire.request("https://httpbin.org/get").responseJSON { response in
// what is going on here work has to be async on the main thread
}
这就是为什么您可以在主线程上遇到任何"挂起"问题的情况下调用它;这并不意味着它没有处理,而是意味着他们为您处理它,因此您不必担心。