2013-04-26 2 views
1

내 문제는이 업데이트를 서버에 게시 할 때 개체 (관계 포함)의 변경에 대한 핵심 데이터의 인식을 조정하는 것입니다. 예를 들어코어 데이터의 특정 NSMangedObjects에 대해 -changedValues를 지울 수있는 방법이 있습니까?

:

  1. 내가이 일대 관계 관리 객체를 말해봐. 나는 두 관계에 포함 된 객체를 얻기 위해 서버를 사용한다. 관계 A에 대해 서버는 1 개의 오브젝트가 속한다고 리턴합니다. 관계 B의 경우 서버는 아무 것도 반환하지 않습니다. 따라서 A에서는 JSON 응답을 NSManagedObject로 구문 분석하여 관계 A에 삽입합니다. B에 대해서는 아무 것도하지 않습니다. 이 시점에서 rel A의 유일한 객체에서 -changedValues을 쿼리한다면 rel A에 삽입 된 이후 rel A의 역함수가 변경되었다고 말할 수 있습니다. 서버에서 가져온 객체를 "default"또는 "last committed"상태를 나타내면, 핵심 데이터 컨텍스트 저장을 실행합니다. 변경된 값은 changedValues가 삽입을 더 이상 반영하지 않습니다. 여태까지는 그런대로 잘됐다.

  2. 다음으로 로컬로 (서버에서 가져 오기가 아니라) 2 개의 객체를 만듭니다. 나는 rel A에 하나를 삽입하고 (그것은 현재 2 개의 객체를 가짐) rel B에 다른 하나를 삽입합니다 (이제 1 개의 객체가 있음).

  3. 이 시점에서, 전체 시스템이 rel A의 첫 번째 객체가 시작되어야한다는 사실을 인식하고 싶습니다. 그래서 아무것도 할 필요가 없습니다. 두 번째 A는 새로운 삽입이므로 서버에 게시해야하고 rel B의 유일한 객체 인 세 번째 객체는 새로운 삽입이기 때문에 POST가 필요합니다.

적절한 관계의 반대 이름이 지정된 키에 대해 -valueChanged 값이있는 적절한 관계 대상 엔터티의 모든 개체에 대한 컨텍스트를 쿼리하여이를 시도했습니다. 즉, 이러한 관계 일부 객체 X입니다, 현재 상태는 다음과 같습니다

x.relA = <NSSet: obj1, obj2> 
x.relB = <NSSet: obj3> 

쿼리는 기본적으로이 원칙적으로 작동

// For each relationship: 
NSError *error = nil; 
     NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] initWithEntityName:mapping.entityName]; 
     NSArray *fetchResult = [self.context executeFetchRequest:fetchRequest error:&error]; 
    NSArray *deletedObjects = [fetchResult filteredArrayUsingPredicate:[NSPredicate predicateWithBlock:^BOOL(id evaluatedObject, NSDictionary *bindings) { 
     id relationship = [evaluatedObject changedValues][<inverseOfRelationship>]; 
     return relationship && ![relationship containsObject:x]; 
    }]]; 

    NSArray *insertedObjects = [fetchResult filteredArrayUsingPredicate:[NSPredicate predicateWithBlock:^BOOL(id evaluatedObject, NSDictionary *bindings) { 
     id relationship = [evaluatedObject changedValues][<inverseOfRelationship>]; 
     return relationship && [relationship containsObject:x]; 
    }]]; 

입니다. 하지만 문제는 내가 먼저 rel A를 평가한다고 말합니다. 삭제 및 삽입 목록을 가져오고 (기본적으로 이미 존재했던 것을 제외하고), 해당 배열에 대해 서버에 적절한 DELETE 및 POST를 실행합니다. 여태까지는 그런대로 잘됐다. 그러나 이제는이 관계가 현재 상태가 "기본"상태가되도록 coredata 컨텍스트 저장을 실행합니다. 승인. 물론 ...하지만 저장은 rel B의 obj3에 대한 변경 사항을 지 웁니다. 따라서 위의 코드와의 관계를 쿼리하려고하면 obj3의 changedValues는 이론적으로 obj3의 rel B가 기본값입니다 (적어도 마지막 저장 이후).

그래서 일부 컨텍스트에만 저장할 수있는 선택적인 컨텍스트를 수행해야합니다 (이 컨텍스트는 저장 및 개체 저장이 아니기 때문에 가능하지 않습니다) 또는 변경된 값을 선택적으로 지우는 방법 예를 들어 서버로 이미 처리 한 객체입니다.

다른 접근법은 추가 된 업데이트/삭제 된 플래그를 ManagedObjects에 삽입하고 내 자신의 코드를 통해 수동으로 처리합니다. 그것이 이미 컨텍스트와 관련하여 이미 관리 된 객체를 나타내는 플래그를 본질적으로 다시 사용하고 있기 때문에 실행 가능하지만 빈틈없는 게토처럼 보입니다.

어떤 생각이나 아이디어가 있습니까?

+0

당신이 당신의 obj2보다에 과도 "더러운"속성을 추가 고려 유무 :

이 문서에서는이 작업을 코딩하는 방법에 대한 훌륭한 설명이 있습니다. 따라서 오름차순의 오르막 만 보낼 수 있습니다. 임시 속성은 저장소에 저장되지 않습니다. –

+0

글쎄, 내가 어떻게 더러운, 삭제, 등등에 대한 몇 가지 플래그를 추가하는 질문의 끝을 향해 일종의 ... 일이 어떻게 일시적으로 더러운 BOOL 변경에 대해 갈 것이라고 때마다 개체가 관계에 추가되면 자동으로? 한 가지 생각은 nsmanagedobject에 대한 카테고리 일 것입니다. nsmanagedobject의 관계가 변경되면 더러운 bool이 yes로 설정되지만 비효율적 인 것으로 보입니다. – SaldaVonSchwartz

답변

0

iOS5 이상에서 쉽게이를 수행 할 수 있습니다.

부모 - 자식 관계로 여러 컨텍스트 저장소를 만듭니다. 하위 컨텍스트를 저장하면 기본적으로 상위 컨텍스트로 푸시됩니다. 예를 들어, RelA에 대한 변경 사항에 대해 하나의 하위 컨텍스트와 RelB에 대한 변경 사항에 대한 다른 하위 컨텍스트가 있습니다.

그러면 RelA를 변경하는 데 사용 된 컨텍스트에서 변경 사항을 저장 한 다음 상위 컨텍스트를 저장합니다. RelB를 변경하는 데 사용 된 컨텍스트는 이로 인해 영향을받지 않습니다. http://www.cocoanetics.com/2012/07/multi-context-coredata/

관련 문제