为什么有时从 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 来获得真正的单例串行队列,并且我会 使用 它。

即便如此,也不会使您的访问线程安全。但它会比你现在做的好很多。