在以下代码中:
class DispatchQueuer: DispatchQueuerable {
private let queue: DispatchQueue
// MARK: - Initialization
init(queue: DispatchQueue) {
self.queue = queue
}
func asyncBackground(block: @escaping () -> Void) {
DispatchQueue(label: "", qos: .background).async {
block() //EXC_BAD_ACCESS
}
}
}
为什么会发生?
我按以下方式使用它:
private let dispatchQueuer: DispatchQueuerable
dispatchQueuer.asyncBackground { [weak self] in
self?.setupTags()
self?.setupSuppliers()
self?.dispatchQueuer.asyncMain {
completion?()
}
}
您有数据竞争问题。问题部分在于每次调用asyncBackground
都在一个新队列上,因此您很快就会有多个冲突队列和冲突访问。你应该把你的队列变成一个单例队列。这样至少您将受益于目前您正在丢弃的串行队列。
请注意,您声明self.queue
为实例属性。这在某种程度上是个好主意,但你永远不会使用它!你也把它扔掉。我个人会static let
用来获得一个真正的单例串行队列,我会使用它。
即便如此,这也不会使您的访问成为线程安全的。但它会比你现在做的好很多。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句