Ios GCD:线程只有两种类型吗?主线程和背景线程

Ios GCD:线程只有两种类型吗?主线程和背景线程,ios,multithreading,threadpool,grand-central-dispatch,qos,Ios,Multithreading,Threadpool,Grand Central Dispatch,Qos,上下文: 据我所知,MainDispatchQueue只在Main-Thread上调度任务,这主要是用于UI的 但是,主线程也可以由非主调度队列使用 苹果有QOS来优先处理任务: 用户交互:在主线程上进行的工作,如动画或绘图操作 用户发起的:由用户开始并应立即产生结果的工作。必须完成此工作,用户才能继续 实用工具:可能需要一点时间而不需要立即完成的工作。类似于进度条和导入数据 背景:此工作对用户不可见。备份、同步、索引等 我的问题是: 正如标题所述,线程是否只包含两种类型,即主线程和后台线程 1

上下文:

据我所知,Main
DispatchQueue
只在
Main-Thread
上调度任务,这主要是用于UI的

但是,
主线程
也可以由非主
调度队列
使用

苹果有
QOS
来优先处理任务:

用户交互:在主线程上进行的工作,如动画或绘图操作

用户发起的:由用户开始并应立即产生结果的工作。必须完成此工作,用户才能继续

实用工具:可能需要一点时间而不需要立即完成的工作。类似于进度条和导入数据

背景:此工作对用户不可见。备份、同步、索引等

我的问题是:

正如标题所述,线程是否只包含两种类型,即
主线程
后台线程

1、
后台线程
是否意味着所有执行的任务都不会阻塞UI

2,既然它提到了
用户交互
是在主线程上执行任务以避免UI延迟的优先级,那么它是否意味着所有其他类型:
用户启动的
实用程序
后台
将确保具有不阻止UI的
后台线程

3、从链接。 它提到了创建调度队列的两种不同方法,有些是并发的,有些是串行的。它还提到,通过使用
default
background
分配QOS,它保证
队列
访问
后台线程
。但是在
串行
并发
中没有提到类似的内容。我想知道这些是对的吗?

你会问:

线程是否只包含两种类型,即主线程和后台线程

我不确定我是否会将它们描述为不同的“类型”,但从应用程序开发人员的角度来看,是的,有“主”线程,专用于UI、主运行循环等,还有所有其他线程,相比之下,它们定义为“后台”线程

我们总是希望对运行主队列的内容保持谨慎(即,不要在主队列上运行任何可能阻塞该线程并有效阻塞UI的内容)。实际上,我们希望避免在主队列上执行任何可能阻塞它最多超过几毫秒的操作

后台线程是否意味着所有执行的任务都不会阻塞UI

实际上,是的。但是我们的设备资源有限,因此开发人员必须明智。例如,对于我们的后台任务,我们希望使用与队列所做工作相称的QoS。或者,如果将某个任务并行化,则应注意约束并发程度。但是,如果一个人对系统资源的使用非常明智,并且一直在主队列之外阻塞任务,那么这就可以确保一个响应良好的UI

一句话,是的,如果您有一些代码会阻止其运行的线程(例如,它的计算成本很高,它有诸如信号量或调度组
wait
等阻止调用),您通常会在后台线程上运行这些代码,以避免阻塞主队列

既然它提到用户交互是在主线程上执行任务以避免UI延迟的优先级,那么它是否意味着所有其他类型:用户启动、实用程序、后台将确保后台线程不会阻塞UI

这些只是“服务质量”级别,它们只是队列的相对优先级。这不是“阻止用户界面”或“不”的问题,而是GCD如何优先分配资源的问题

从链接中,了解如何在Swift 3中创建调度队列。它提到了创建调度队列的两种不同方法,一些是并发的,一些是串行的

。。。它还提到,通过使用默认或后台分配QOS,它保证队列访问后台线程

这不太有道理。也许你可以分享这些文件的具体摘录,我们可以帮助你解释他们想说什么

。。。但在串行和并发文件中没有提到类似的内容。我想知道这些是对的吗


QoS只是给定队列的优先级和资源问题。串行与并发只是一个问题,一个队列是否一次仅限于一个线程,或者它是否可以在需要和可用时使用多个线程。

为什么要否决这个问题?这还不够具体吗?我认为这是一个很好的问题,我也在寻求答案。