首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在iOS中同步与异步队列

在iOS中同步与异步队列
EN

Stack Overflow用户
提问于 2020-02-03 13:14:22
回答 3查看 397关注 0票数 2

我对JS有一些了解,我正在浏览iOS

我当时正在读这个博客,我对Swift中的异步和同步感到困惑(尽管我觉得IOS和Javascript中的异步和同步是一样的),但无论如何

代码语言: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的内容

代码语言:javascript
运行
复制
1
1
1
1
2
2
2
2
2

考虑到这个例子,如果它是同步而不是异步,那么输出将是相同的吗?那么,使用上面的异步有什么用呢?

另外,在JS中我们需要等待。我们不需要做任何事吗?有人能给我解释一下异步的例子,然后迅速等待吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2020-02-03 13:43:55

由于对这两种工作都使用相同的队列,第二个异步块在第一个块结束之前不会开始执行。它是异步的还是串行的并不重要。

如果在两个队列之间添加一个print语句,您将看到.async.sync之间的真正区别。如下所示:

代码语言:javascript
运行
复制
queue.async {
    for _ in 1...100 {
          self.smile()
    }
}
print("Finished printing smiles")
queue.async {
    for _ in 1...100 {
          self.love()
    }
}

之前的代码可能会打印“完成打印微笑”,甚至在它已经开始打印微笑!这是因为异步工作立即返回并继续执行代码。

让我们看看如果用同步队列更改队列会发生什么:

代码语言:javascript
运行
复制
queue.sync {
    for _ in 1...100 {
          self.smile()
    }
}
print("Finished printing smiles")
queue.sync {
    for _ in 1...100 {
          self.love()
    }
}

是啊。现在,同步队列在结束之前等待,然后再继续。所以,你会得到100个微笑,然后“完成打印微笑”。

如果您想实现并发,即同时执行两个代码块(但不是同时执行,因为这是并行的),则必须使用两个不同的队列,或者在队列配置中指定.concurrent参数:

代码语言:javascript
运行
复制
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()
        }
    }
}

正如您所看到的,这里的顺序是混乱的,并且在执行过程中会有所不同。这是因为两个队列同时运行。

另一个等同于这一代码的是:

代码语言:javascript
运行
复制
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()
    }
}
票数 2
EN

Stack Overflow用户

发布于 2020-02-03 14:05:42

卢弗兰科和罗伯托已经详细地回答了问题。

您还可以在单个OperationQueue上实现这一点,在其上添加不同的BlockOperation

就好像您会在这个场景中看到:

代码语言:javascript
运行
复制
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:

代码语言:javascript
运行
复制
operation2.addDependency(operation1)
queue.addOperation (operation1)
queue.addOperation (operation1)

产出如下:

票数 2
EN

Stack Overflow用户

发布于 2020-02-03 13:26:21

当您使用同步时,它会在队列的线程中执行,但是同步在完成之前不会返回。异步立即返回。

因为您有一个串行队列,所以打印结果是相同的,但是调用函数可以在队列完成打印之前返回。如果是同步的,则调用函数将等待打印完成。

Swift中还没有异步/等待概念。这不是这里正在发生的事情(或者在同步情况下)。

如果要查看差异,请将睡眠放在块中,并在队列调用之外打印。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60039998

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档