2017-10-12 163 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:使用通知尚未解決您的問題? –