为什么有时从 DIspatchQueue 调用时我有 EXC_BAD_ACCESS?
Why sometimes do I have EXC_BAD_ACCESS when called from DIspatchQueue?
在以下代码中:
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
来获得真正的单例串行队列,并且我会 使用 它。
即便如此,也不会使您的访问线程安全。但它会比你现在做的好很多。
在以下代码中:
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
来获得真正的单例串行队列,并且我会 使用 它。
即便如此,也不会使您的访问线程安全。但它会比你现在做的好很多。