Ios Swift:与DispatchGroup的死锁
我对CoreData并发性有一些问题。 我无法执行Ios Swift:与DispatchGroup的死锁,ios,swift,core-data,concurrency,grand-central-dispatch,Ios,Swift,Core Data,Concurrency,Grand Central Dispatch,我对CoreData并发性有一些问题。 我无法执行上下文。在目标线程被DispatchGroup阻止时执行 下面是一个简单的示例,说明了问题: func upload(objects: [NSManagedObject]) { let group = DispatchGroup() for object in objects { group.enter() upload(object) { group.leave()
上下文。在目标线程被DispatchGroup
阻止时执行
下面是一个简单的示例,说明了问题:
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()
}
}
}
请帮助我正确地重新实现这一点。谢谢。使用调度组而不是等待,应该可以解决您的问题
调用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()
}
}
在调度组上使用而不是等待,应该可以解决您的问题
调用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()
}
}
这应该可以做到;)顺便说一句,他原来的update
函数在一个明显同步的函数上使用了一个不必要的完成块。对我来说没什么意义…@AndriyTrubchanin:使用notify并没有解决你的问题?@Puneet Sharma使用notify解决了我的问题。代码变得越来越复杂,我想办法让它变得更简单。不管怎样,谢谢你。@AndriyTrubchanin:很乐意帮忙。您可以将现有代码分解为相关函数,然后从其他函数调用它们。@PuneetSharma我有类似的东西,但不起作用。。。这只是我第一次没有苹果id来测试订阅时才会发生,之后,当重新启动应用程序时,它就会起作用。我不明白为什么它不能第一次处理完成处理程序?应该这样做;)顺便说一句,他原来的update
函数在一个明显同步的函数上使用了一个不必要的完成块。对我来说没什么意义…@AndriyTrubchanin:使用notify并没有解决你的问题?@Puneet Sharma使用notify解决了我的问题。代码变得越来越复杂,我想办法让它变得更简单。不管怎样,谢谢你。@AndriyTrubchanin:很乐意帮忙。您可以将现有代码分解为相关函数,然后从其他函数调用它们。@PuneetSharma我有类似的东西,但不起作用。。。这只是我第一次没有苹果id来测试订阅时才会发生,之后,当重新启动应用程序时,它就会起作用。我不明白为什么它不能第一次处理完成处理程序?