Ios Swift:与DispatchGroup的死锁

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()

我对CoreData并发性有一些问题。 我无法执行
上下文。在目标线程被
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来测试订阅时才会发生,之后,当重新启动应用程序时,它就会起作用。我不明白为什么它不能第一次处理完成处理程序?