2013-04-26 2 views
2

핵심 데이터 중첩 컨텍스트 설정이 있습니다. UI의 메인 큐 컨텍스트와 SQLite 영구 저장소에 저장. 웹 서비스와 데이터를 동기화하기위한 개인 큐 컨텍스트자식 컨텍스트에서 저장을 처리하는 방법은 있지만 부모 컨텍스트에서 개체가 이미 삭제 되었습니까?

내 문제는 동기화 프로세스가 오래 걸릴 수 있으며 동기화 대상이 기본 대기열 컨텍스트에서 삭제 될 수 있다는 것입니다. 개인 큐가 저장되면 "핵심 데이터가 오류를 수행 할 수 없습니다"예외로 인해 충돌합니다.

이 문제를 확인하는 방법이나이 사례를 처리하기위한 컨텍스트를 구성하는 방법에 대한 제안 사항이 있습니까?

답변

5

중첩 된 컨텍스트 뒤에는 마법이 없습니다. 추가 작업없이 동시성과 관련된 많은 문제를 해결하지 못합니다. 많은 사람들 (당신은 그 사람들 중 한 사람인 것처럼 보입니다)은 일을하기로되어 있지 않은 상자에서 일할 것을 기대합니다. 다음은 약간의 배경 정보입니다.

개인 큐 동시성 유형을 사용하여 하위 컨텍스트를 만드는 경우 핵심 데이터는이 컨텍스트의 큐를 만듭니다. 이 컨텍스트에 등록 된 객체와 상호 작용하려면 performBlock : 또는 performBlockAndWait : 중 하나를 사용해야합니다. 이 두 메소드가 수행하는 가장 중요한 작업은 전달 된 블록을 컨텍스트의 큐에서 호출하는 것입니다. 아무것도 더 - 아무것도 덜.

비 핵심 데이터 기반 응용 프로그램의 컨텍스트에서 잠시 생각해보십시오. 백그라운드에서 무언가를하고 싶다면 새로운 대기열을 만들고 그 대기열에서 백그라운드로 작업 할 수있는 블록을 예약 할 수 있습니다. 작업이 완료되면 백그라운드 작업의 결과를 앱 로직 내부의 다른 레이어에 전달하고자합니다. 사용자가 배경 작업의 결과와 관련된 객체/데이터를 삭제하면 어떻게됩니까? 기본적으로 동일 : 충돌.

경험 한 경험은 핵심 데이터 관련 문제가 아닙니다. 동시성을 도입하자 마자 문제가됩니다. 당신이 필요로하는 것은 당신의 자녀와 부모의 맥락 사이의 계약 또는 어떤 종류의 계약에 대해 생각하는 것입니다. 예를 들어 루트 컨텍스트에서 개체를 삭제하기 전에 다른 큐에서 실행중인 모든 작업/블록을 취소하고 실제로 개체를 삭제하기 전에 취소가 완료 될 때까지 기다려야합니다.

+0

답변 해 주셔서 감사합니다. 하지만 CoreData가 하위 컨텍스트의 데이터를 검사하기 위해 제공하는 메커니즘이 있는지 알고 싶습니다. 아니면 더 나은 솔루션. –

+1

existingObjectWithID : error : (NSManagedObjectContext)를 사용할 수 있습니다. 이 경우 objectWithID :를 사용하지 마십시오. 그러나 일종의 "정상적인"정책을 갖는 것이 훨씬 낫습니다. 너무 많은 동시성은 해롭다. 중첩 된 컨텍스트 및 동시성 유형의 경우에도 핵심 데이터 및 동시성은 사용 사례를 열심히 생각함으로써 가능합니다. 나쁜 소식의 메신저가되어 매우 유감입니다. –