当我运行代码时,我点击iphone主页按钮,然后重新打开我的应用程序,我的应用程序冻结了。我感到不确定,为什么?
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()
}
}
发布于 2021-01-04 14:55:51
我预计这将尝试创建超过250个线程,这是您不想做的。也就是说,我怀疑真正的问题是在前台出现的问题是在其他地方;可能是在NetCenter。您可能会死锁主队列(特别是如果NetCenter是以相同的样式编写的)。
您可以通过在串行队列上使用单个DispatchWorkItem和您的信号量来实现相同的功能,而不是启动大量的DispatchWorkItems然后阻塞它们。串行队列将不再需要锁。它一次序列化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使用与此函数相同的队列,则肯定会死锁。)
https://stackoverflow.com/questions/65563200
复制相似问题