2013-05-20 3 views
6

NSManagedObjectContext의 performBlock : 및 performBlockAndWait : 메서드를 추가하여 동시성을 쉽게 만듭니다. 나는 그걸 사용 했었습니다. 잠재적으로 상당히 순진 할 것 같았습니다. 그리고 저는 정말로 묻지 않은 질문이 있다는 것을 깨달았습니다.컨텍스트의 performBlock 외부에서 NSManagedObject를 사용할 수 있습니까?

performBlock 메서드 중 하나에 NSManagedObject 하위 클래스를 만드는 경우 'home'스레드는 상위 컨텍스트의 스레드입니다. NSPrivateQueueConcurrencyType의 경우에는 아마도 다른 스레드에 액세스 할 수 없습니다.

그래서 내 관리 대상 객체에 포함 된 데이터에 액세스하기 위해 performBlock 호출을 수행해야합니까? 아니면 getter를 사용할 때 나를 보호 할 배경 마술이 있습니까? (또는 setters, 나쁜 생각 같아요 ...)

답변

13

NSManagedObjectmanagedObjectContext의 스레드/대기열 (때때로 작동하고 충돌하는 경우도 있습니다 ==>하지 마십시오. 그것).

CoreData는 개체에 대한 안전한 읽기 액세스를 보장하지 않습니다.

당신은 그것의 objectID 또는 managedObjectContext 속성에 액세스하지 않는 한 항상 하나 [context performBlock:...] 또는 [context performBlockAndWait:...]을 사용하십시오 "개인 큐"컨텍스트가 소유 한 개체에 액세스합니다.

+0

감사합니다. 꽤 많이 생각하고 있었는데 ... 나는 틀렸어. 그들이 기술을 도입 한 곳에서 WWDC 비디오를 다시 볼 필요가 있습니다. 그 일을해야한다는 것을 기억하지 못하기 때문에 ... 다시 한번, 다시보아야 할 WWDC 비디오가 많이 있습니다. – RonLugge

+1

저는 애플 엔지니어가 명시 적으로 'NSManagedObject'에 대한 읽기가 코어 데이터가 캐싱을 수행하고 쓰레드 안전하지 않기 때문에 스레드로부터 안전하지 않다고 명시하고 싶습니다. –

9

performBlock: 또는 performBlockAndWait:을 사용해야하지만 한 가지 예외가 있습니다. NSMainQueueConcurrencyType을 사용하는 경우 기본 대기열에서 관리 대상 개체를 사용 중이므로 블록없이 직접 액세스 할 수 있습니다. 이는 관리 객체에서 UI를 업데이트해야하거나 그 반대의 경우에도 유용 할 수 있습니다.

+1

또 다른 예외는 메인 큐와 유사한'NSConfinementConcurrencyType'입니다 , 전용 스레드 (관리 컨텍스트의 "이전"버전)에만 적용됩니다. –

+0

본질적으로 NSPrivateQueue 및 NSMainQueue 유형과 관련이 있기 때문에 제 질문에 대해 더 잘 설명 했어야합니다 ... 개인 큐 버전 이 훌륭한 예외 덕분에. – RonLugge

관련 문제