ios - 什么是默认线程
问题描述
在iOS
中,我们必须处理并发编程GCD
。Operation
调查GCD
我们有QoS
类,它们简单明了,这个问题是关于为什么通常DispatchQueue.main.async
用于在.Main Thread
因此,当我们通常处理更新中的某些内容时,UI
我们通常使用该功能,因为以防止应用程序出现任何无响应。
UIViewController
让我觉得是在通常在主线程中执行的内部编写代码?
但也知道callback & completionHandler
通常在没有指定它们所在的线程的情况下执行,并且UI
从来没有遇到过问题!所以它在背景上?
斯威夫特如何处理这个?我在默认情况下写什么线程而不指定任何内容?
解决方案
由于这里的问题不止一个,让我们尝试一一回答。
为什么 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
那么我们应该假设它为您处理它!这并不意味着它没有在某处实施。
另一个真实世界的例子,Alamofire!打电话时
Alamofire.request("https://httpbin.org/get").responseJSON { response in
// what is going on here work has to be async on the main thread
}
这就是为什么您可以调用它而不会在主线程上遇到任何“挂起”问题;这并不意味着它没有处理,而是意味着他们为你处理它,所以你不必担心它。
推荐阅读
- c# - 错误值不在使用 itextsharp 创建 pdf 的预期范围内
- java - 使用 && 运算符的长 if() 语句,还是单独的 if 语句?
- sql - SQL Server 不允许我使用刚刚创建的用户和登录
- c# - C#在循环中动态调用函数
- typescript - 如何在抽象类或接口中正确描述/转换打字稿多态自我
- orocommerce - oro commerce - 通过api添加多个产品
- python - Jupyter 中没有名为“casADI”的模块
- google-cloud-sql - 如何解决 CloudSQL 中的复制错误
- sql - 在 SQL 中给出意外输出的两个字段的商的 AVG()
- python - 在从 github 上传的 Elastic Beanstalk 中运行 Python 文件