Ios 主线程上的异步任务与同步任务相同吗?
我知道这两种之间的区别 对于异步任务,下一个任务将在当前任务开始后运行,这意味着如果有可用线程,任务将被分派到多个线程。 对于同步任务,下一个任务将在当前任务完成后运行 由于主线程只有一个线程,它如何运行异步任务 这让我很困惑。Ios 主线程上的异步任务与同步任务相同吗?,ios,swift,grand-central-dispatch,Ios,Swift,Grand Central Dispatch,我知道这两种之间的区别 对于异步任务,下一个任务将在当前任务开始后运行,这意味着如果有可用线程,任务将被分派到多个线程。 对于同步任务,下一个任务将在当前任务完成后运行 由于主线程只有一个线程,它如何运行异步任务 这让我很困惑。 提前谢谢 您对异步和同步的定义不太正确 在中央调度中心,你考虑队列,而不是线程。队列可以是串行调度队列,也可以是并发调度队列 串行调度队列一次可以运行一个任务,并且一个接一个地串行调度任务 并发调度队列可以在多个线程上同时运行多个任务 任务在线程上执行,Grand Ce
提前谢谢 您对异步和同步的定义不太正确
在中央调度中心,你考虑队列,而不是线程。队列可以是串行调度队列,也可以是并发调度队列
串行调度队列一次可以运行一个任务,并且一个接一个地串行调度任务 并发调度队列可以在多个线程上同时运行多个任务 任务在线程上执行,Grand Central Dispatch负责为您的线程分配任务主队列是一个特殊的串行调度队列,它只将任务分配给主线程。其他队列可以将任务分配给任何可用线程,包括主线程 现在,对于同步调度和异步调度,区别在于调度是阻塞当前线程直到调度任务完成同步,还是在不阻塞当前线程的情况下对任务进行排队异步 当您异步调度到主队列上时,您提供了一个工作单元,Grand Central dispatch将在将来的某个点分配给主线程,但是您的代码将继续执行,而不等待该调度项完成 您可以在主队列上运行时将异步任务分派到主队列,因为分派的任务将在主队列准备好执行任务后执行 您不能做的是从主队列同步调度到主队列,或者更一般地说,从同一队列同步调度到任何串行调度队列,因为您将创建死锁
调度同步阻止当前线程/队列,直到调度的项目完成。在串行调度队列上,调度项无法执行,因为调度队列被阻塞。您对异步和同步的定义不太正确
在中央调度中心,你考虑队列,而不是线程。队列可以是串行调度队列,也可以是并发调度队列
串行调度队列一次可以运行一个任务,并且一个接一个地串行调度任务 并发调度队列可以在多个线程上同时运行多个任务 任务在线程上执行,Grand Central Dispatch负责为您的线程分配任务主队列是一个特殊的串行调度队列,它只将任务分配给主线程。其他队列可以将任务分配给任何可用线程,包括主线程 现在,对于同步调度和异步调度,区别在于调度是阻塞当前线程直到调度任务完成同步,还是在不阻塞当前线程的情况下对任务进行排队异步 当您异步调度到主队列上时,您提供了一个工作单元,Grand Central dispatch将在将来的某个点分配给主线程,但是您的代码将继续执行,而不等待该调度项完成 您可以在主队列上运行时将异步任务分派到主队列,因为分派的任务将在主队列准备好执行任务后执行 您不能做的是从主队列同步调度到主队列,或者更一般地说,从同一队列同步调度到任何串行调度队列,因为您将创建死锁 调度同步阻止当前线程/队列,直到调度的项目完成。在串行调度队列上,由于调度队列被阻塞,无法执行调度项 对于异步任务,下一个任务将在当前任务开始后运行,这意味着如果有可用线程,任务将被分派到多个线程 不完全是。异步分派只意味着当前线程不会等待分派的代码完成。它与目标队列是串行队列还是并发队列完全无关 对于同步任务,下一个任务将在当前任务完成后运行 再说一次,不完全是。同步分派只意味着当前线程将等待分派的代码完成执行 调度的代码是否与之前调度到该队列的其他项目并发运行取决于队列类型,即串行或并发,而不是同步或异步调度。 由于主线程只有一个线程,它如何运行异步任务 现在很明显,“异步”与“同步”并不是被调度任务的一个特征,而只是指示从中调度的线程是否应该等待
因此,考虑一些异步将代码发送回主线程的代码:
let task = URLSession.dataTask(with: request) { data, _, _ in
let results = ... // on `URLSession` background serial queue, only populate local variables
DispatchQueue.main.async {
self.objects = results // dispatch model updates back to main queue
self.tableView.reloadData() // also update UI from main queue
}
}
task.resume()
在上面的示例中,我们将模型和UI更新分派到主队列,因为我们位于URLSession后台队列上,该队列碰巧也是一个串行队列。我们异步地分派它,因为URLSession的串行队列没有理由等待分派的代码完成。我们本来可以同步调度它,但为什么还要阻塞URLSession队列,哪怕只是多出几毫秒呢
对于异步任务,下一个任务将在当前任务开始后运行,这意味着如果有可用线程,任务将被分派到多个线程
不完全是。异步分派只意味着当前线程不会等待分派的代码完成。它与目标队列是串行队列还是并发队列完全无关
对于同步任务,下一个任务将在当前任务完成后运行
再说一次,不完全是。同步分派只意味着当前线程将等待分派的代码完成执行
调度的代码是否与先前调度到该队列的其他项并发运行取决于队列类型,即串行或并发,而不是同步或异步调度
由于主线程只有一个线程,它如何运行异步任务
现在很明显,“异步”与“同步”并不是被调度任务的一个特征,而只是指示从中调度的线程是否应该等待
因此,考虑一些异步将代码发送回主线程的代码:
let task = URLSession.dataTask(with: request) { data, _, _ in
let results = ... // on `URLSession` background serial queue, only populate local variables
DispatchQueue.main.async {
self.objects = results // dispatch model updates back to main queue
self.tableView.reloadData() // also update UI from main queue
}
}
task.resume()
在上面的示例中,我们将模型和UI更新分派到主队列,因为我们位于URLSession后台队列上,该队列碰巧也是一个串行队列。我们异步地分派它,因为URLSession的串行队列没有理由等待分派的代码完成。我们本来可以同步调度它,但为什么还要阻塞URLSession队列,哪怕只是额外的几毫秒。检查这是真的解释完整检查这是真的解释完整其他队列可以将任务分配给任何可用线程,包括主线程。除了来自主线程的串行分派之外,这是不正确的。调度到后台队列通常是将长时间运行的任务从主线程中移除的一种方法。如果这些队列中的一个可以在主线程上运行这样的任务,它将锁定UI。否则,答案很好+1除了表示应用程序主线程的调度队列外,系统不保证使用哪个线程执行任务。。主队列以外的队列可以使用主线程,它仅用于异步调度的工作项。使用主队列可以保证块将使用主线程。错误,我在前面的注释中是指从主线程进行的同步调度不是串行的。但是,实际上,这是另一个队列使用主线程的唯一方法。如果其他队列可以使用主线程从另一个线程进行调度或从主线程进行异步调度,则会破坏一切。其他队列可以将任务分配给任何可用线程,包括主线程。除了来自主线程的串行分派之外,这是不正确的。调度到后台队列通常是将长时间运行的任务从主线程中移除的一种方法。如果这些队列中的一个可以在主线程上运行这样的任务,它将锁定UI。否则,答案很好+1除了表示应用程序主线程的调度队列外,系统不保证使用哪个线程执行任务。。主队列以外的队列可以使用主线程,它仅用于异步调度的工作项。使用主队列可以保证块将使用主线程。错误,我在前面的注释中是指从主线程进行的同步调度不是串行的。但是,实际上,这是另一个队列使用主线程的唯一方法。如果其他队列可以使用主线程从另一个线程进行调度,或者从主线程进行异步调度,那么这将破坏一切。