anb*_*anb 1 grand-central-dispatch ios swift
我知道这两种之间的区别。
对于异步任务,下一个任务将在当前任务开始后运行,这意味着如果有可用线程,任务将被分派到多个线程。
对于同步任务,下一个任务将在当前任务完成后运行。
主线程如何运行异步任务,因为它只有一个线程?
这让我很困惑。
提前致谢。
您对异步和同步的定义不太正确。
在 Grand Central Dispatch 中,您考虑的是队列,而不是线程。队列要么是串行调度队列,要么是并发调度队列。
串行调度队列可以一次运行一个任务,任务一个接一个(串行)调度。
并发调度队列可以在多个线程上同时运行多个任务。
任务在线程上执行,Grand Central Dispatch 负责为您将任务分配给线程。
主队列是一个特殊的串行调度队列,只将任务分配给主线程。其他队列可以将任务分配给任何可用线程,包括主线程。
现在,对于同步和异步分派,区别在于分派是阻塞当前线程直到分派任务完成(同步)还是将任务排队而不阻塞当前线程(异步)。
当您异步调度到主队列时,您提供了一个工作单元,Grand Central Dispatch 将在未来某个时刻分配给主线程,但您的代码会继续执行,而无需等待该调度项目完成。
在主队列上运行时,您可以很愉快地将异步任务分派到主队列,因为当主队列准备好任务时,分派的任务将在稍后执行。
您不能做的是从主队列同步分派到主队列(或者更一般地说,从同一队列同步分派到任何串行分派队列),因为您会造成死锁。
调度同步阻塞当前线程/队列,直到调度的项目完成。在串行调度队列上,调度项目无法执行,因为调度队列被阻塞。