, 그것은 배경 멀티 스레드 문제를 처리하기 위해Swift 3에서 코어 데이터 동시성이 멀티 스레딩과 어떻게 작동합니까? 내 프로그램에서
DispatchQueue.global(qos: .background)
및
self.concurrentQueue.sync(flags: .barrier)
을 모두 사용합니다. 나는 또한 그런
문제가 발생 디버깅 할 -com.apple.CoreData.ConcurrencyDebug 1
수 있도록
lazy var context: NSManagedObjectContext = {
return (UIApplication.shared.delegate as! AppDelegate).persistentContainer.newBackgroundContext()
}()
:
이 3 그래서 나는 childContext을 얻을 수있는 최신 방법을 사용하여 신속입니다
1을 참조하면, 거기이다 API 호출 및 콜백 블록 (백그라운드 스레드)에서 핵심 데이터를 가져 와서 편집 한 다음 저장해야합니다. 위의 코드에서 self.context를 호출하여 performBlockAndWait
을 호출하고이 블록 내부에 save
을 넣으려고했습니다. 전체 프로세스가 잘 진행되지만이 블록 외부에서 결과를 액세스하려고 시도하지만 콜백 블록 내부에서 오류가 발생합니다. 나는 또한 objectId와 getObjectById
을 self.context와 self.context.parent로 가져 오려고 시도했으며이 줄에서 오류가 발생합니다. 내가 뭘 잘못했는데 어떻게해야합니까? 왜냐하면 나는 많은 다른 스레드 (컨텍스트가 아님)에서 결과를 사방에 사용해야하기 때문입니다.
2, 게시물마다 스레드 당 하나의 컨텍스트가 필요하다고 말하면서, 내 경우에는 API 호출로부터의 콜백이라면 어떤 정확한 스레드인지를 어떻게 결정할 수 있습니까?
3 내 프로그램이 백그라운드 스레드에서 실행되어야하므로 (다른 게시물에서 읽음)이 방법으로 수행해야하므로 privateConcurrentType이 필요한 이유는 무엇입니까?
4, 내 질문에 1, 내 상황에서 여전히 작동하지 않는 다른 컨텍스트로 objectId 전달하여 개체를 가져옵니다. 이것이 적절한 방법이라고 가정합시다. 슈퍼 유저가 아닌 다른 스레드에서 내 전체 프로그램 전체에 걸쳐 너무 많은 objectID를 전달하는 것을 어떻게 처리할까요? 나에게 이것은 미친 소리지만,이 문제를 다루는 훨씬 더 깔끔하고 쉬운 방법이 있다고 생각한다.
5, 일부 게시물은 꽤 오래되었습니다 (스위프트 3 이전). childContext.save
(parentContext.save
)이 필요하지만 위의 코드 (스위프트 3에만 해당)를 사용하고 있습니다. 그것은 작동하도록 childContext.save 할 수있는 것? 내가 맞습니까?
백그라운드 스레드의 컨텍스트에 액세스하려고하면 "오류"가 정확히 "발생"합니까? –