2012-10-10 5 views
1

제목 질문에 대한 간단한 예제 : 한 스레드가 Place 엔터티를 준비했으며 일부 처리를하고 있습니다 (특정 필드를 채우고 계산하는 데 시간이 걸립니다). 한편 다른 스레드는 이미 Category 엔터티를 준비했습니다. 두 번째 "Category"스레드는 으로 Category 엔티티를 보존하려고합니다. & 오류 첫 번째 스레드의 Place 엔티티가 처리 작업을 완료하지 않은 동안에도 저장되도록합니다.각 스레드가 다른 스레드의 데이터와 관련이없는 데이터로 작업 할 수있을 때 하나의 공유 관리 객체 컨텍스트를 스레드간에 재사용 할 수 있습니까?

맞습니까? 하나의 공유 moc를 사용하면 문제가 설명 된 것을 볼 수 있습니까?

감사합니다.

답변

1

스레드간에 NSManagedObjectContext 개를 공유하지 마십시오. 스레드간에 NSManagedObject을 공유하지 마십시오. 예외는 없습니다. Concurrency with Core Data을 읽고 설명하는 패턴을 적용하십시오.

1

사실, 그것은 가능하며 당신이 찾고있는 방법은 다음과 같습니다

-(void)mergeChangesFromContextDidSaveNotification:(NSNotification *)notification;

당신은 각 스레드에 대해 다른 NSManagedObjectContext를 작성해야하고 당신이 할 일은 당신의 NSManagedObjectContext을 넣어하는 것입니다 NSNotificationNSManagedObjectContextDidSaveNotification 키를 입력하고 기본 센터에 등록하십시오. 호출시 주 스레드에서 mergeChangesFromContextDidSaveNotification을 수행하고 save:&error 메소드를 호출 할 때마다 변경 사항이 병합됩니다.

참고 : 객체를 가져 오는 동안 그것은, 내 의견으로는, 그것은 다른 문맥에 약간의 단점 속할 수있다 (이 가져 오는 후 전무 예정)하고 않는 경우 당신은 그것을 다르게 가져올 수 있습니다

YourObject *copy =(YourObject*) [managedObjectContext objectWithID:objectID];

NSManagedObjectID *objectID = [YourObject objectID];

는 도움이되기를 바랍니다. Here은 내가 말하는 것을 더 잘 이해할 수있는 링크입니다.