javascript - iOS中的同步与异步队列

标签 javascript ios swift asynchronous

我对 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/

相关文章:

arrays - Swift:如何获得两个结构数组之间的差异

javascript - 在 iframe 加载之前运行脚本

iphone - 尝试使用 UI 自动化点击 UITableViewCell 中的 UIButton 失败,返回 "could not be tapped"

javascript - 简单地通过扩展来覆盖 jQuery 函数?

ios - Metal着色器代码 "crash?"在什么条件下出现

ios - NSFetchedResultsControllerDelegate 在错误的 indexPath 上动画删除

ios - 使用 Swift 和 Parse 获取 Facebook UserData 时出现 fatal error

ios - 容器 View 操作

javascript - 如何将参数传递给 babel 6 中预设的插件?

javascript - 如何显示水平网格