2017-10-12 128 views
0

我在CoreData并发性方面遇到了一些问题。 我不能做context.perform而目标线程被阻止DispatchGroupSwift:与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() 
     } 
    } 
} 

请帮我正确地重新实现这一点。谢谢。

回答

1

在调度组上使用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() 
    } 
} 
+1

这应该这样做;)顺便说一下,他原来的'update'函数在清晰的同步函数中使用了一个不必要的*完成块*。对我来说没有多大意义... –

+0

我更新了我的第一个功能,使其具有一定的意义。 –

+0

@AndriyTrubchanin:使用通知尚未解决您的问题? –