2017-10-12 8 views
0

CoreData 동시성 문제가 있습니다. 대상 스레드가 DispatchGroup으로 차단되는 동안 context.perform을 수행 할 수 없습니다.Swift : 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 : 알림을 사용하여 문제가 해결되지 않았습니까? –