DispatchSemaphore导致app卡死,如何解决

DispatchSemaphore cause app frozen, how to resolve it

当我 运行 代码时,我单击 iphone 主页按钮,然后重新打开我的应用程序,我的应用程序 frozen.i 感觉不确定,为什么?

let queue = DispatchQueue(label: "com.aiswei.asw.monitior.search",qos: .default, attributes: .concurrent)
        let semaphore = DispatchSemaphore(value: 30)
        let minX = 2
        let maxX = 254
        self.index = minX
self.index = minX
        let count = maxX - minX + 1
        let lock = NSLock()
        for i in minX...maxX {
            queue.async {
                semaphore.wait()
                lock.lock()
                // request some server api  result
                 NetCenter.requestAPi { (result) in
                    semaphore.signal()
                }
            
                lock.unlock()
              
            }
        
        }

我希望这会尝试创建超过 250 个线程,而您不想这样做。就是说,我怀疑实际问题出在前台出现在其他地方;可能在 NetCenter 中。您可能使主队列陷入僵局(尤其是当 NetCenter 以相同的风格编写时)。

与其启动大量 DispatchWorkItem 然后阻止它们,您可以通过在串行队列上使用单个 DispatchWorkItem 和信号量来实现相同的目的。串行队列将摆脱对锁的需要。这一次序列化 30 个操作,这就是我想你想要的。

    let queue = DispatchQueue(label: "com.aiswei.asw.monitior.search")
    let semaphore = DispatchSemaphore(value: 30)

    queue.async {
        let minX = 2
        let maxX = 254
        for _ in minX...maxX {
            semaphore.wait()
            NetCenter.requestAPi { (result) in
                semaphore.signal()
            }
        }
    }
}

我在这里假设 requestAPi 是一个异步方法,并将其完成处理程序安排在 queue 以外的某个队列上。 (如果 NetCenter 使用与此函数相同的队列,那肯定会死锁。)