swift 中 DispatchQueue 类型之间的区别
Difference between DispatchQueue types in swift
据我了解 swift 中有 3 种类型的 DispatchQueue:
- 主(串行)(主线程)
- 全局(并发)(后台线程并行工作)
- 自定义(并发或串行)
并且每个都可能工作(异步或同步)
第一题:
主队列是否只在 UI 线程上工作 而不是在另一个线程上工作?
如果答案是肯定的,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
上执行,所以如果您将代码块同步发送到 main
队列,您将阻止 UI 更新,因此您的应用程序将冻结。
据我了解:
队列不是线程
主队列和全局队列可以在同一个线程中工作
Dispatched:表示将任务放入队列
如果全局队列在主队列中调度为sync,调度的任务将工作在 Main queue 的同一线程上,并将已调度的任务添加到 Global queue ,
并且这个任务会冻结线程
如果全局队列在主队列中调度为异步,调度的任务将工作在 Main queue 的其他线程上,并将调度任务添加到 Global queue ,
并且这个任务不会冻结线程
如果 Main queue 在 Main queue 中调度为 async ,调度的任务将工作在 主队列
的同一线程上
如果主队列在主队列中调度作为同步将产生异常,因为死锁
Dispatch.sync: 将任务放入队列并等待直到完成
Dispatch.async: 将任务放入队列中,不等到完成(任务可能在同一个线程或另一个线程中工作)
如果任务在全局队列上分派并且这个协议来自主线程
然后任务将添加到全局队列,新线程将
创建并且任务将在新线程中立即开始工作
如果任务在主队列上分派并且这个协议来自主线程
然后任务将添加到主队列,并且不会工作
立即直到队列中的旧任务完成工作(因为 Main
队列是顺序的 )
据我了解 swift 中有 3 种类型的 DispatchQueue:
- 主(串行)(主线程)
- 全局(并发)(后台线程并行工作)
- 自定义(并发或串行)
并且每个都可能工作(异步或同步)
第一题:
主队列是否只在 UI 线程上工作 而不是在另一个线程上工作?
如果答案是肯定的,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
上执行,所以如果您将代码块同步发送到 main
队列,您将阻止 UI 更新,因此您的应用程序将冻结。
据我了解:
队列不是线程
主队列和全局队列可以在同一个线程中工作
Dispatched:表示将任务放入队列
如果全局队列在主队列中调度为sync,调度的任务将工作在 Main queue 的同一线程上,并将已调度的任务添加到 Global queue , 并且这个任务会冻结线程
如果全局队列在主队列中调度为异步,调度的任务将工作在 Main queue 的其他线程上,并将调度任务添加到 Global queue , 并且这个任务不会冻结线程
如果 Main queue 在 Main queue 中调度为 async ,调度的任务将工作在 主队列
的同一线程上如果主队列在主队列中调度作为同步将产生异常,因为死锁
Dispatch.sync: 将任务放入队列并等待直到完成
Dispatch.async: 将任务放入队列中,不等到完成(任务可能在同一个线程或另一个线程中工作)
如果任务在全局队列上分派并且这个协议来自主线程 然后任务将添加到全局队列,新线程将 创建并且任务将在新线程中立即开始工作
如果任务在主队列上分派并且这个协议来自主线程 然后任务将添加到主队列,并且不会工作 立即直到队列中的旧任务完成工作(因为 Main 队列是顺序的 )