DispatchQueue 同步块与异步块

DispatchQueue sync block vs async block

假设我有以下 DispatchQueue:

let myqueue = DispatchQueue(label: "myqueue")

async块和sync块有什么区别?谁能解释一下这是什么意思?

e.g 在主线程中,在主线程执行的中间。如果我调用 myqueue.async{...}myqueue.sync{...}

会发生什么

例如

override func viewDidLoad() {
    super.viewDidLoad()

    myqueue.async{...}

    myqueue.sync{...}
}

dispatch_async:

Submits a block for asynchronous execution on a dispatch queue and returns immediately.

dispatch_sync:

Submits a block object for execution on a dispatch queue and waits until that block completes.

dispatch_sync会在块完成后return,同时dispatch_async会在加入队列后return,可能还没有完成。

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

当您向 运行 Task1 sync 提交一个块时,Task2 将等到该块完成,然后 Task2 才会 运行.

当您向 运行 Task1 async 提交块时,Task2 也会 运行 并且 Task1 可以在 Task2 之前或之后完成。

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

并且同步你的主线程将等待那个进程以同步方式完成工作将等到我的 queue.sync 的进程没有完成

使用 collectionView 显示多张图片的例子 如果使用 Sync,将首先下载图像,然后显示集合视图。直到没有获取所有图像,它才会显示 并且异步图像将在后台下载并显示集合视图,并且根据正在下载的图像,它们将开始一张一张地显示在集合视图中

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

不管怎样,我做了实验测试自己的问题。所以我要post在这里回答我的问题。

  1. 异步块和同步块有什么区别?谁能解释一下这是什么意思?

答:对于async中的代码,async block下面的一行会在dispatchQueue完成它的dispatch job后立即执行,即没有阻塞/等待async block的完成。 另一方面,对于同步块,同步块正下方的行将被阻塞并等待同步块的完成。因此,在这种情况下,保证代码的执行顺序是运行一行一行的顺序

  1. e.g 在主线程中,在主线程执行的中间。如果我调用 myqueue.async{...} 或 myqueue.sync{...} 会发生什么?

答案:myqueue只是一个队列。因此元素(调度代码 blocks/jobs/tasks/actions 随便命名)可以 运行 主线程或不在主线程中。如果我们在主线程调用myqueue.async{...},分派的代码块不会在主线程运行,而是分派到另一个线程执行。如果我们在主线程中调用 myqueue.sync{...} ,代码块就像普通的代码语句一样,所以它后面的行将被阻塞,直到代码块完成并且它们的执行都发生在主线程中线。

例如,由于 viewDidLoad 在主线程中始终处于 运行,如果我们在 viewDidLoad 中调用 myqueue.async{...}{...} 块将被分派到另一个要执行的线程,并且它下面的行不会等待它完成并且执行不会被阻塞。如果我们调用 myqueue.sync{...}{...} 块将在主线程中发生。所以块下方的行将等待块的完成。