我对JS有一些了解,我正在浏览iOS
我当时正在读这个博客,我对Swift中的异步和同步感到困惑(尽管我觉得IOS和Javascript中的异步和同步是一样的),但无论如何
import UIKit
func smile () {
print('1')
}
func love() {
print('2')
}
//Serial Queue
let queue = DispatchQueue(label: 'SerialQueue')
queue.async {
for _ in 1...5 {
smile()
}
}
queue.async {
for _ in 1...5 {
love()
}
}这将记录类似于以下1的内容
1
1
1
1
2
2
2
2
2考虑到这个例子,如果它是同步而不是异步,那么输出将是相同的吗?那么,使用上面的异步有什么用呢?
另外,在JS中我们需要等待。我们不需要做任何事吗?有人能给我解释一下异步的例子,然后迅速等待吗?
发布于 2020-02-03 13:43:55
由于对这两种工作都使用相同的队列,第二个异步块在第一个块结束之前不会开始执行。它是异步的还是串行的并不重要。
如果在两个队列之间添加一个print语句,您将看到.async和.sync之间的真正区别。如下所示:
queue.async {
for _ in 1...100 {
self.smile()
}
}
print("Finished printing smiles")
queue.async {
for _ in 1...100 {
self.love()
}
}之前的代码可能会打印“完成打印微笑”,甚至在它已经开始打印微笑!这是因为异步工作立即返回并继续执行代码。
让我们看看如果用同步队列更改队列会发生什么:
queue.sync {
for _ in 1...100 {
self.smile()
}
}
print("Finished printing smiles")
queue.sync {
for _ in 1...100 {
self.love()
}
}是啊。现在,同步队列在结束之前等待,然后再继续。所以,你会得到100个微笑,然后“完成打印微笑”。
如果您想实现并发,即同时执行两个代码块(但不是同时执行,因为这是并行的),则必须使用两个不同的队列,或者在队列配置中指定.concurrent参数:
override func viewDidLoad() {
let queue = DispatchQueue(label: "SerialQueue")
let queue2 = DispatchQueue(label: "AnotherQueue")
queue.async {
for _ in 1...100 {
self.smile()
}
}
print("Finished printing smiles")
queue2.async {
for _ in 1...100 {
self.love()
}
}
}正如您所看到的,这里的顺序是混乱的,并且在执行过程中会有所不同。这是因为两个队列同时运行。
另一个等同于这一代码的是:
let queue = DispatchQueue(label: "ConcurrentQueue", attributes: .concurrent)
queue.async {
for _ in 1...100 {
self.smile()
}
}
print("Finished printing smiles")
queue.async {
for _ in 1...100 {
self.love()
}
}发布于 2020-02-03 14:05:42
卢弗兰科和罗伯托已经详细地回答了问题。
您还可以在单个OperationQueue上实现这一点,在其上添加不同的BlockOperation。
就好像您会在这个场景中看到:
let queue = OperationQueue()
let operation1 = BlockOperation {
for _ in 1...5 {
smile()
}
}
print("Done")
let operation2 = BlockOperation {
for _ in 1...5 {
love()
}
}
queue.addOperation (operation1)
queue.addOperation (operation2)产出如下:

如果要添加operation2依赖于operation1:
operation2.addDependency(operation1)
queue.addOperation (operation1)
queue.addOperation (operation1)产出如下:

发布于 2020-02-03 13:26:21
当您使用同步时,它会在队列的线程中执行,但是同步在完成之前不会返回。异步立即返回。
因为您有一个串行队列,所以打印结果是相同的,但是调用函数可以在队列完成打印之前返回。如果是同步的,则调用函数将等待打印完成。
Swift中还没有异步/等待概念。这不是这里正在发生的事情(或者在同步情况下)。
如果要查看差异,请将睡眠放在块中,并在队列调用之外打印。
https://stackoverflow.com/questions/60039998
复制相似问题