首页 > 解决方案 > 什么是默认线程

问题描述

iOS中,我们必须处理并发编程GCDOperation

调查GCD我们有QoS类,它们简单明了,这个问题是关于为什么通常DispatchQueue.main.async用于在.Main Thread

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

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

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

斯威夫特如何处理这个?我在默认情况下写什么线程而不指定任何内容?

标签: iosswiftmultithreading

解决方案


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

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

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

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

请记住,这DispatchQueue.main串行队列。使用sync或与确定队列的序列化货币async无关,而是指如何处理任务。这样说的意思是:DispatchQueue.main.async

在发送任务以在不同队列上执行后立即将控制权返回给当前队列。它不会等到任务完成。它不会阻塞队列。

引用自:https ://stackoverflow.com/a/44324968/5501940 (我建议检查一下。)

换句话说,async意味着:这将发生在主标题上,并在完成时更新它。这就是你所说的:

因此,当我们通常在 UI 中处理更新某些内容时,我们通常会使用该功能,以防止应用程序出现任何无响应。

似乎是明智的;使用- 而sync不是async- 将阻止 main。


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

首先:默认情况下,没有指定哪个线程应该执行一段代码,它将是主线程。但是,您的问题似乎并不具体,因为在 a 内部,UIViewController我们可以通过指定它来调用未在主线程上执行的功能。


但也知道回调和完成处理程序通常在没有指定它们所在的线程的情况下执行,并且用户界面从来没有遇到过问题!所以它在背景上?

“知道回调和完成处理程序通常在不指定它们所在的线程的情况下执行”不!你必须指定它。一个很好的真实例子,实际上这就是主线程检查器的工作方式。

我相信您在这里缺少一些东西,当处理来自 -for instance- 的内置方法UIKit返回完成处理程序时,我们看不到它包含类似于DispatchQueue.main.async调用完成处理程序时的内容;因此,如果您没有在其内部完成处理程序中执行代码,DispatchQueue.main.async那么我们应该假设它为您处理它!这并不意味着它没有在某处实施。

另一个真实世界的例子,A​​lamofire!打电话时

Alamofire.request("https://httpbin.org/get").responseJSON { response in
    // what is going on here work has to be async on the main thread
}

这就是为什么您可以调用它而不会在主线程上遇到任何“挂起”问题;这并不意味着它没有处理,而是意味着他们为你处理它,所以你不必担心它。


推荐阅读