6

据我了解,在 swift 中有 3 种类型的 DispatchQueue:

  • Main(串行) (主线程)
  • 全局(并发) (后台线程并行工作)
  • 自定义(并发或串行)

每个都可能工作(异步或同步)

第一个问题:

它是仅在 UI 线程上工作而不在另一个线程上工作的主队列吗?如果答案是肯定的,如何DispatchQueue.Main.async不阻塞 UI 线程。DispatchQueue.global如果回答否,只要DispatchQueue.Main.async在另一个线程中工作,使用有什么好处。

第二个问题:

DispatchQueue.global (async)DispatchQueue.global (sync)之间有什么区别,只要这个队列工作Concurrent 以及在哪里使用每个?

第三个问题:

什么是区别

  1. (串行和同步)
  2. (并发和异步)
4

2 回答 2

10

我认为:

队列不是线程

主队列和全局队列可以在同一个线程中工作

Dispatched:表示将任务放入队列

如果全局队列主队列中作为同步调度,则被调度的任务将在主队列的同一线程上工作,并且被调度的任务添加到 全局队列中, 并且该任务将冻结线程

如果全局队列异步方式在主队列中调度,则调度的任务将在主队列的其他线程上工作,并将调度任务添加到 全局队列中, 并且该任务不会冻结线程

如果Main queueMain queue中作为async调度,则调度的任务将在Main queue的同一线程上工作

如果在队列中作为同步调度的主队列将产生异常,因为使死锁

Dispatch.sync:将任务放入队列并等待它完成

Dispatch.async:将任务放入队列中,直到完成(任务可能在同一个线程或另一个线程中工作)

  • 如果任务在全局队列上分派并且来自主线程,那么任务将添加到全局队列中,并且将创建新线程并且任务将立即在新线程中开始工作

  • 如果任务在主队列上分派并且来自主线程,则该任务将添加到主队列,并且不会立即工作,直到队列中较旧的任务完成工作(因为主队列是顺序的)

于 2018-10-03T11:33:25.563 回答
3

DispatchQueue's 不直接对应于单个线程。唯一的限制是您只能从主线程访问 UI,这可以通过DispatchQueue.main. 但是,如果您在特定队列上调用它,则无法保证系统会将您的执行块分派到特定线程。

DispatchQueue.async是非阻塞操作,因此您可以在同一个队列上异步执行多个代码块而不会阻塞特定线程,这就是为什么您应该始终将操作异步分派到主队列,以避免阻塞 UI 更新,因为主队列是单独负责 UI 相关的任务。调用async任何队列,并不能保证执行将发生在特定线程(无论是后台还是主线程)上,它只保证操作将以非阻塞方式执行。

DispatchQueue.sync是一个阻塞操作,这意味着在执行单个sync代码块时,不能在特定的 上执行其他代码DispatchQueue,因此如果您将代码块同步发送到main队列,您将阻止 UI 更新,因此您的应用程序将冻结。

于 2018-10-02T09:16:12.167 回答