swift中DispatchQueue类型之间的差异
据我所知,swift中有3种类型的DispatchQueue:swift中DispatchQueue类型之间的差异,swift,multithreading,asynchronous,grand-central-dispatch,dispatch-queue,Swift,Multithreading,Asynchronous,Grand Central Dispatch,Dispatch Queue,据我所知,swift中有3种类型的DispatchQueue: 主(串行)(主线程) 全局(并发)(后台线程并行工作) 自定义(并发或串行) 每个都可能工作(异步或同步) 第一个问题: 主队列是否仅在UI线程上工作而不在另一个线程上工作? 如果答案是肯定的,那么如何DispatchQueue.Main.async不阻塞UI线程。 如果答案是否定的,那么只要DispatchQueue.Main.async在另一个线程中工作,使用DispatchQueue.global有什么好处 第二个问题:
- 主(串行)(主线程)
- 全局(并发)(后台线程并行工作)
- 自定义(并发或串行)
DispatchQueue.Main.async
不阻塞UI线程。
如果答案是否定的,那么只要DispatchQueue.Main.async
在另一个线程中工作,使用DispatchQueue.global
有什么好处
第二个问题:
只要此队列同时工作,那么DispatchQueue.global(异步)和DispatchQueue.global(同步)之间的区别是什么?在哪里使用每个队列
第三个问题:
两者之间的差异是什么
DispatchQueue
不直接对应于单个线程。唯一的限制是您只能从主线程访问UI,这可以通过DispatchQueue.main
完成。但是,如果在特定队列上调用执行块,则无法保证系统会将其分派到特定线程
DispatchQueue.async
是一种非阻塞操作,因此您可以在同一队列上异步执行多个代码块,而无需阻塞特定线程,这就是为什么您应该始终异步将操作分派到主队列,以避免阻塞UI更新,因为主队列只负责与UI相关的任务。在任何队列上调用async
,并不保证执行将发生在特定线程上(无论是后台线程还是主线程),它只保证以非阻塞方式执行操作
DispatchQueue.sync
是一种阻塞操作,这意味着在执行单个sync
代码块时,无法在特定的DispatchQueue
上执行其他代码块,因此如果同步地将代码块分派到主队列,您将阻止UI更新,因此您的应用程序将冻结。据我所知:
队列不是线程
主队列和全局队列可以在同一线程中工作
已调度:表示将任务放入队列
如果全局队列在主队列中作为同步调度,则调度的任务将在主队列和添加到全局队列的调度任务的同一线程上工作,
此任务将冻结线程
如果全局队列在主队列中调度为异步,则调度的任务将在主队列的其他线程上工作,并将调度的任务添加到全局队列,
并且此任务不会冻结线程
如果Main queue在Main queue中调度为async,则调度的任务将在Main queue的同一线程上工作
如果Main queue在Main queue中调度为sync,则会出现异常,因为make死锁
分派.sync:将任务放入队列,等待它完成
Dispatch.async:将任务放入队列,不要等到它完成(任务可以在同一线程或另一线程中工作)
- 如果任务在全局队列上调度,并且此一致性来自主线程
然后,任务将添加到全局队列中,并创建新线程
创建,任务将立即在新线程中开始工作
- 如果任务在主队列上调度,并且此一致性来自主线程
然后该任务将添加到主队列中,并且将不起作用
直到队列中较旧的任务完成工作(因为
队列(按顺序排列)
只要DispatchQueue.global是并发的,在与(sync)一起使用时将如何阻止它。并发意味着队列中的每个元素将在单独的队列中工作thread@user3141421没有并发的调度队列
。正如我所说的,您可以同步地(这将是一个阻塞操作)或异步地(非阻塞,您可以称之为并发)将执行块分派到队列,但队列本身不是并发的。如果一个队列将工作项分派到多个不同的线程,那么它可以并发执行任务,但是你可以通过同步分派执行块来阻止任何队列。我不同意你的观点,根据苹果的文档:分派队列可以是串行的,这样工作项一次只能执行一个,也可能是这样concurrent@user3141421这是正确的,但是并发调度队列
只意味着它能够并发执行任务。这并不意味着它只能同时执行任务。同步调度任务将使并发队列的行为类似于串行队列,直到同步阻塞操作完成执行。串行调度队列是否仅同步工作?