Swift:DispatchGroup 死锁
Swift: Deadlock with DispatchGroup
我遇到了 CoreData 并发问题。
当目标线程被 DispatchGroup
.
阻塞时,我无法执行 context.perform
这是一个简单的例子来说明这个问题:
func upload(objects: [NSManagedObject]) {
let group = DispatchGroup()
for object in objects {
group.enter()
upload(object) {
group.leave()
}
}
group.wait() // current thread is blocked here
someAdditionalWorkToDoInSameThread()
}
func upload(object: NSManagedObject, completion: ()->()) {
let context = object.managedObjectContext
performAlamofireRequest(object) {
context.perform {
// can't reach here because the thread is blocked
update(object)
completion()
}
}
}
请帮我正确地重新实现它。谢谢
在调度组上使用 notify 而不是等待,应该可以解决您的问题。
调用 wait()
阻塞当前线程以完成先前提交的工作。
notify(queue:execute:)
将通知您作为参数传递的队列组任务已完成。
func upload(objects: [NSManagedObject], completion: ()->()) {
let group = DispatchGroup()
for object in objects {
group.enter()
upload(object) {
group.leave()
}
}
group.notify(queue: DispatchQueue.main) {
completion()
}
}
我遇到了 CoreData 并发问题。
当目标线程被 DispatchGroup
.
context.perform
这是一个简单的例子来说明这个问题:
func upload(objects: [NSManagedObject]) {
let group = DispatchGroup()
for object in objects {
group.enter()
upload(object) {
group.leave()
}
}
group.wait() // current thread is blocked here
someAdditionalWorkToDoInSameThread()
}
func upload(object: NSManagedObject, completion: ()->()) {
let context = object.managedObjectContext
performAlamofireRequest(object) {
context.perform {
// can't reach here because the thread is blocked
update(object)
completion()
}
}
}
请帮我正确地重新实现它。谢谢
在调度组上使用 notify 而不是等待,应该可以解决您的问题。
调用 wait()
阻塞当前线程以完成先前提交的工作。
notify(queue:execute:)
将通知您作为参数传递的队列组任务已完成。
func upload(objects: [NSManagedObject], completion: ()->()) {
let group = DispatchGroup()
for object in objects {
group.enter()
upload(object) {
group.leave()
}
}
group.notify(queue: DispatchQueue.main) {
completion()
}
}