我对 JS 有一些想法,并且正在通过 iOS
我正在阅读 this blog并且对 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
考虑这个例子,如果它是同步而不是异步,那么输出会是一样的吗?那么上面使用 async 有什么用呢?
此外,在 JS 中,我们需要等待。 swift 我们不需要做任何事情?有人可以通过快速给出异步和等待的例子来向我解释吗?
最佳答案
由于您对这两项工作使用相同的队列,因此第二个异步 block 在第一个 block 结束之前不会开始执行。它是异步的还是串行的都没关系。
您将看到 .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()
}
}
关于javascript - iOS中的同步与异步队列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60039998/