什么是默认线程



iOS中,我们有GCDOperation来处理并发编程。

看看我们GCDQoS类,它们简单明了,这个问题是关于为什么DispatchQueue.main.async通常用于异步Main Thread中的X任务。

因此,当我们通常处理UI中的更新某些内容时,我们通常使用该函数,以防止应用程序的任何无响应。

让我觉得在UIViewController内编写代码通常在主线程中执行吗?

但也知道callback & completionHandler通常在没有指定它们所在的线程的情况下执行,而且UI从来没有遇到过问题!! 所以它在后台?

Swift 如何处理这个问题? 默认情况下,我在哪个线程上写入而没有指定任何内容?

由于这里有不止一个问题,让我们尝试一一回答。

为什么 DispatchQueue.main.async 通常用于异步 X 任务 在主线程中。

在提到直接答案之前,请确保您没有混淆理解:

  • 串行<===>并发。
  • 同步<===>异步。

请记住,DispatchQueue.main串行队列。使用syncasync与确定队列的序列化货币无关,而是它们指的是如何处理任务。因此,说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
}

这就是为什么您可以在主线程上遇到任何"挂起"问题的情况下调用它;这并不意味着它没有处理,而是意味着他们为您处理它,因此您不必担心。

最新更新