假设我有以下DispatchQueue
:
let myqueue = DispatchQueue(label: "myqueue")
async
阻止和sync
阻止有什么区别?有人能解释一下这意味着什么吗?
例如在主线程中,在主线程的中间执行。如果我致电myqueue.async{...}
或myqueue.sync{...}
e.g
override func viewDidLoad() {
super.viewDidLoad()
myqueue.async{...}
myqueue.sync{...}
}
答案 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所提到的,async
和sync
的Apple文档是除非。
无论如何,我做了实验测试自己的问题。所以我将在这里发布我的答案。
答案:对于异步中的代码,异步块下面的行将在dispatchQueue完成其调度作业后立即执行,即没有阻塞/等待异步块的完成。 另一方面,对于同步块,同步块正下方的线将被阻塞并等待同步块的完成。因此,在这种情况下,确保代码执行的顺序依次在一行一行中运行。
答案:myqueue
只是一个队列。因此,元素(调度的代码块/作业/任务/动作以您喜欢的名称命名)可以在主线程中运行主线程。如果我们在主线程中调用myqueue.async{...}
,则调度的代码块将不会在主线程中运行,并将调度到另一个线程以执行它。如果我们在主线程中调用myqueue.sync{...}
,那么代码块就像一个普通的代码语句,因此它之后的行将被阻塞,直到代码块完成并且它们的执行都发生在主代码块中线。
例如,由于viewDidLoad
始终在主线程中运行,如果我们在myqueue.async{...}
内调用viewDidLoad
,{...}
块将被调度到另一个线程被执行,它下面的行不会等待它的完成,执行不会被阻止。如果我们调用myqueue.sync{...}
,{...}
块将在主线程中发生。因此,块下方的线将等待块的完成。