7

CoreData에 대해 알고 있습니다. 분명히 당신이 포함하는 주요 클래스 중 하나는 NSManagedObjectContext입니다. 나는 이것의 정확한 역할에 대해 불분명하다. 읽은 기사에서 여러 개의 NSManagedObjectContext를 가질 수 있습니다. 이것은 NSManagedObjectContext가 기본적으로 백엔드의 사본이라는 것을 의미합니까?NSManagedObjectContext confusion

다양한 사본이 여러 개있는 경우 일관된 백엔드로 어떻게 해결됩니까?

그래서,이 질문에 기본적으로 :

는 NSManagedContext은 백엔드 데이터베이스의 복사본인가?

하고 ... 예를 들어

, 나는 상황에 맞는 A의 변화를 만들어 B. 그럼 내가 전화 맥락에서 다른 변화는 다음, 첫 번째에 B를 절약 할 말? B가 우세합니까?

감사

답변

11

NSManagedObjectContext은 백엔드 데이터베이스의 복사본이 아니다. documentation 스크래치 패드

NSManagedObjectContext의 인스턴스가 애플리케이션의 단일 "개체 공간"또는 스크래치 패드를 나타내는대로 설명한다. 관리되는 개체의 컬렉션을 관리하는 일차적 인 책임은 입니다. 이러한 개체는 하나 이상의 영구 저장소로 내부적으로 일관된 뷰 을 나타내는 관련 모델 개체의 그룹 을 형성합니다. 하나의 관리 대상 객체 인스턴스 이 하나의 컨텍스트에만 존재하지만 객체 의 여러 복사본이 서로 다른 컨텍스트에 존재할 수 있습니다. 따라서 객체 uniquing은 특정 컨텍스트로 범위가 지정됩니다.

NSManagedObjectContext은 관리 방식의 개체를 트랜잭션 방식으로 변경하기위한 일시적인 장소입니다. 문맥에서 객체를 변경할 때 문맥을 저장할 때까지 백엔드 데이터베이스에 영향을 미치지 않으며, 문맥을 변경할 수있는 여러 문맥을 가질 수있을 때까지 concurrency에 대해 실제로 중요한 변경 사항을 적용 할 때까지는 백엔드 데이터베이스에 영향을 미치지 않습니다.

질문 2 번에 대해서는 사용자가 설정 한 merge policy과 B가 될 last라는 설정이 다릅니다. 다음은 두 번째 컨텍스트에 영향을 미칠 수있는 병합 정책입니다 구원 받는다. NSErrorMergePolicyType

어떤 갈등을 병합가있는 경우가 실패에 저장됩니다 정책을 지정합니다. NSMergeByPropertyStoreTrumpMergePolicyType


는 외부 변화에 우선 순위를 부여 영구 저장소의 객체 의 버전과 현재 메모리 버전 사이에 충돌을 병합하는 정책을 지정합니다.


NSMergeByPropertyObjectTrumpMergePolicyType는 메모리 변경에 우선 순위를 부여 영구 저장소의 객체의 버전 현재 메모리 버전 사이에 충돌을 병합하는 정책을 지정합니다. NSOverwriteMergePolicyType


는 가 충돌 변경된 개체의 영구 저장소에 상태를 덮어 정책을 지정합니다.


NSRollbackMergePolicyType는 정책을 지정합니다 충돌 개체에 대한 파기 메모리 상태 변경.

+0

"동시성." 링크가 만료되었습니다. –

+0

@ Mr.UB 해결되었습니다. 감사합니다. – Joe

2

NSManagedObjectContext는 데이터 모델의 특정 표현입니다. 각 컨텍스트는 고유 한 상태 (예 : 컨텍스트)를 유지하므로 한 컨텍스트의 변경이 다른 컨텍스트에 직접 영향을 미치지 않습니다. 컨텍스트가 변경 사항을 상점에 저장할 때 변경 사항을 병합하여 일관성있게 유지하는 것은 다중 컨텍스트로 작업 할 때 책임이 있습니다.

귀하의 질문은이 프로세스와 관련이 있으며 병합 충돌을 포함 할 수도 있습니다. 컨텍스트를 저장할 때마다 변경 내용이 저장소에 커밋되고 병합 정책이 충돌을 해결하는 데 사용됩니다.

컨텍스트를 저장하면 진행 상황에 대한 다양한 알림이 게시됩니다. 귀하의 경우 [contextA save:&error]이 성공하면 컨텍스트는 NSManagedObjectContextDidSaveNotification이라는 알림을 게시합니다. 여러 상황이있을 때, 일반적으로이 알림을 관찰하고 전화 :

[contextB mergeChangesFromContextDidSaveNotification:notification]; 

contextBcontextA에 저장된 변경 내용을 병합합니다.

편집 : 'thread-safe'주석을 삭제했습니다. NSManagedObjectContext은 스레드로부터 안전하지 않습니다.