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 使用与此函数相同的队列,那肯定会死锁。)
当我 运行 代码时,我单击 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 使用与此函数相同的队列,那肯定会死锁。)