gpt4 book ai didi

ios - 什么时候在 ios 中选择 serialQueue 而不是并发队列

转载 作者:行者123 更新时间:2023-12-05 09:28:00 24 4
gpt4 key购买 nike

我被要求在 swift 中实现一个线程安全的字典,我使用了常见的方法:

 class MutableDictionary {
var dictionary: [String : Any] = [:]
var queue = DispatchQueue(label: "queue", attributes: .concurrent)

func object(for key: String) -> Any? {
queue.sync {
return dictionary[key]
}
}

func set(_ object: Any?, for key: String) {
queue.async(flags: .barrier) {
self.dictionary[key] = object
}
}
}

但是,接下来的问题是:

  1. 在这种情况下使用 concurrent + barrier 与仅使用 serialQueue 进行设置有什么区别?
  2. 我在 playground 上做了一个测试,我用 1000 次 for 循环包装了 get 和 set,事实证明串行和并发队列的行为几乎相同。
  3. 为什么设置总是报错? enter image description here
  4. 与串行队列相比,并发队列在这种情况下(对于 get 和 set)有何优势?
  5. 在 iOS 中,什么时候应该选择串行队列而不是并发队列?反之亦然?

最佳答案

1、使用barrier,并发队列暂时可以一次执行一个任务。 enter image description here

但是,serialQueue 一次只能执行一项任务。

2、假设你只用队列来读/写,显然它们的效果是一样的。如果你将另一种任务交给它,显然并发队列的成本更低,这才是真正的区别。

3、提交给async对象的地址会在你的对象是类的时候定义。当你给类成员一个新值时,你将有一个错误的地址,所以你无法访问它并且错误来了。您可以通过结构尝试.

4、引用答案1

5、有时候希望任务执行得更快,concurrentQueue优先。如果你想有序地执行任务,serialQueue 做的更好。

关于ios - 什么时候在 ios 中选择 serialQueue 而不是并发队列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71850309/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com