DispatchQueue同步块与异步块

时间:2017-06-22 03:34:29

标签: swift asynchronous synchronization grand-central-dispatch

假设我有以下DispatchQueue

let myqueue = DispatchQueue(label: "myqueue")

async阻止和sync阻止有什么区别?有人能解释一下这意味着什么吗?

例如在主线程中,在主线程的中间执行。如果我致电myqueue.async{...}myqueue.sync{...}

,会发生什么?

e.g

override func viewDidLoad() {
    super.viewDidLoad()

    myqueue.async{...}

    myqueue.sync{...}
}

3 个答案:

答案 0 :(得分:2)

dispatch_async:

  

提交一个用于在调度队列上执行异步执行的块   马上回来。

dispatch_sync:

  

提交一个块对象以便在调度队列上执行并等待   直到该块完成。

块结束后

dispatch_sync将返回,同时dispatch_async将在添加到队列后返回,并且可能无法完成。

示例:
您有两个任务,Task1和Task2。

当您提交一个块来运行Task1 sync时,Task2将等待,直到Task2运行之前完成。

当你提交一个块来运行Task1 async时,Task2也会运行,Task1可以在Task2之前或之后完成。

答案 1 :(得分:0)

以异步模式执行操作时。主线程将不会等待它完成它将与主线程并行运行,但具有在后台线程中运行并释放主线程的优势。就像在Async(背景)线程中下载图像一堆图像

同步你的主线程将等待该进程以同步方式完成工作将等到我的queue.sync进程未完成

使用collectionView显示多个图像的示例 如果使用同步第一个图像将被下载,然后显示集合视图。直到所有图像都没有被提取,它不会显示 并且在异步图像中将在后台下载并显示集合视图,并且根据正在下载的图像,它们将开始逐一显示在集合视图中

答案 2 :(得分:0)

我不知道为什么我的上述问题被否决了。正如@rmaddy所提到的,asyncsync的Apple文档是除非。

无论如何,我做了实验测试自己的问题。所以我将在这里发布我的答案。

  1. 异步块和同步块有什么区别?有人能解释一下这意味着什么吗?
  2. 答案:对于异步中的代码,异步块下面的行将在dispatchQueue完成其调度作业后立即执行,即没有阻塞/等待异步块的完成。 另一方面,对于同步块,同步块正下方的线将被阻塞并等待同步块的完成。因此,在这种情况下,确保代码执行的顺序依次在一行一行中运行。

    1. 例如在主线程中,在主线程的中间执行。如果我调用myqueue.async {...}或myqueue.sync {...}会怎么样?
    2. 答案:myqueue只是一个队列。因此,元素(调度的代码块/作业/任务/动作以您喜欢的名称命名)可以在主线程中运行主线程。如果我们在主线程中调用myqueue.async{...},则调度的代码块将不会在主线程中运行,并将调度到另一个线程以执行它。如果我们在主线程中调用myqueue.sync{...},那么代码块就像一个普通的代码语句,因此它之后的行将被阻塞,直到代码块完成并且它们的执行都发生在主代码块中线。

      例如,由于viewDidLoad始终在主线程中运行,如果我们在myqueue.async{...}内调用viewDidLoad{...}块将被调度到另一个线程被执行,它下面的行不会等待它的完成,执行不会被阻止。如果我们调用myqueue.sync{...}{...}块将在主线程中发生。因此,块下方的线将等待块的完成。