什么是默认线程

时间:2019-03-06 09:34:51

标签: ios swift multithreading

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

调查GCD我们有QoS类,它们很简单直接,这个问题是关于为什么DispatchQueue.main.async通常用于异步 X Main Thread中的任务。

因此,当我们通常处理UI中的某些内容时,我们通常会使用该功能,因为这样可以防止应用程序产生任何不响应。

让我认为是在UIViewController内编写通常在主线程中执行的代码吗?

,但也知道callback & completionHandler通常在执行时没有指定它们所在的线程,而UI从来没有遇到过问题!就是背景吗?

Swift如何处理此问题?我默认在什么线程上写而未指定任何内容?

1 个答案:

答案 0 :(得分:0)

由于此处存在多个问题,让我们尝试一个接一个地回答它们。

  

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

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

  • 序列<===>并发。
  • 同步<===>异步

请记住,DispatchQueue.main serial 队列。使用syncasync与确定队列的序列化 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

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