2017-06-22 120 views
0

假设我有以下DispatchQueueDispatchQueue同步块VS异步块

let myqueue = DispatchQueue(label: "myqueue") 

是什么async块和sync块之间的区别?有人可以解释它的意思吗?

例如在主线程中,在主线程的中间执行。它会发生什么,如果我叫myqueue.async{...}myqueue.sync{...}

e.g

override func viewDidLoad() { 
    super.viewDidLoad() 

    myqueue.async{...} 

    myqueue.sync{...} 
} 
+0

看到这个https://stackoverflow.com/questions/21122842/whats-the-difference-between-synchronous-and-asynchronous-calls-in-objective-c – Bilal

+0

由于某些原因,文档为'async'和DispatchQueue的'sync'方法没用。但是,如果您阅读相应Objective-C函数“dispatch_async”和“dispatch_sync”的文档,则区别很明显。 – rmaddy

回答

2

dispatch_async:

提交一个块上调度队列,并立即 回报异步执行。

dispatch_sync:

提交一个块对象执行一个调度队列,直到该块完成等待 。块结束后同时dispatch_async它被添加到队列之后将返回,可能无法完成

dispatch_sync将返回。

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

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

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

0

当您在异步模式下执行操作时。主线程不会等待它完成,它将与主线程并行运行,但有利于它在后台线程中运行并释放主线程。如下载图像的一些图片,在异步(后台)线程

而在同步你的主线程将等待该进程完成同步的方式将作品等到我queue.sync的过程没有完成

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

0

我不不知道为什么我的问题被拒绝。正如@rmaddy所提到的,苹果文档为asyncsync是除非。

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

  1. 异步块和同步块有什么区别?有人可以解释它的意思吗?

回答:对于async中的代码,在dispatchQueue完成其派送作业后立即执行异步块下面的行,即没有阻塞/等待异步块的完成。另一方面,对于同步块,同步块正下方的行将被阻塞并等待同步块的完成。因此,在这种情况下,确保代码的执行顺序按一行顺序运行一行。

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

答案:myqueue只是一个队列。所以元素(派发的代码块/作业/任务/动作命名任何你喜欢的)可以运行主线程或不在主线程中。如果我们在主线程中调用myqueue.async{...},派发的代码块将不会在主线程中运行,并将派发到另一个线程执行。如果我们在主线程中调用myqueue.sync{...},那么代码块就像一个普通的代码语句,所以在它之后的行将被阻塞,直到代码块完成并且它们的执行全部发生在主线程中。

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