2017-12-29 43 views
0

은 여러 개의 관리되는 개체 컨텍스트와 함께 작동하는 방법을 학습하고, 드릴의 중간에왜 NSManagedObject 인스턴스를 절대로 한 스레드에서 다른 스레드로 전달하면 안됩니까?

let childContext = 
NSManagedObjectContext(
concurrencyType: .mainQueueConcurrencyType) 
childContext.parent = coreDataStack.mainContext 

let childEntry = 
childContext.object(with: surfJournalEntry.objectID) 
as? JournalEntry 

detailViewController.journalEntry = childEntry 
detailViewController.context = childContext 
detailViewController.delegate = self 

나는이 말에 다 퉜다 :

당신이 :)와 (객체를 사용해야합니다 관리 대상 개체가 해당 개체를 만든 컨텍스트에 특정하기 때문에 업무 일지 항목을 검색 할 수 있습니다.

나는 왜 MOC에서 다른 관리 대상으로 가져온 관리 대상 개체를 전달하는 것이 엄격히 금지되어 있기 때문에 밀려났습니다. 누군가가 왜 당신이 그것을 무너 뜨릴 수 있는지 알고 있다면?

답변

1

코어 데이터는 스레드로부터 안전하지 않습니다. 그것은 거의 그것입니다.

여러 스레드에서 개체 나 메서드를 사용하는 경우 스레드로부터 안전하지 않은 경우 재앙이 발생합니다. 손상된 데이터 및 앱 충돌이 자주 발생합니다. 더 나쁜 것은 항상 발생하지 않을 수도 있고 다른 사용자에게 서로 다른 시간에 발생할 수도 있습니다. 이것은 코어 데이터뿐만 아니라 모든 멀티 스레드 코드에 해당됩니다.

그 메시지가 당신에게 말하고있는 것이 아닙니다. "... 관리 객체는 해당 객체를 만든 컨텍스트에만 해당됩니다." 그건 완전히 다른 문제입니다.

관리 객체를 가져올 때 관리 객체 컨텍스트를 사용하여 관리 객체를 가져옵니다. 컨텍스트는 관리 객체와 기본 영구 저장 파일 간의 링크입니다. 다른 컨텍스트와 함께 관리 객체를 사용하려고하면 해당 컨텍스트는 아무 것도 알지 못합니다. 어떤 식 으로든 개체를 사용할 수는 없습니다. 코드에서 이것이 어디에서 발생하는지 알기는 어렵지만 메시지가 의미하는 것입니다.