내 문제는이 업데이트를 서버에 게시 할 때 개체 (관계 포함)의 변경에 대한 핵심 데이터의 인식을 조정하는 것입니다. 예를 들어코어 데이터의 특정 NSMangedObjects에 대해 -changedValues를 지울 수있는 방법이 있습니까?
:
- 내가이 일대 관계 관리 객체를 말해봐. 나는 두 관계에 포함 된 객체를 얻기 위해 서버를 사용한다. 관계 A에 대해 서버는 1 개의 오브젝트가 속한다고 리턴합니다. 관계 B의 경우 서버는 아무 것도 반환하지 않습니다. 따라서 A에서는 JSON 응답을 NSManagedObject로 구문 분석하여 관계 A에 삽입합니다. B에 대해서는 아무 것도하지 않습니다. 이 시점에서 rel A의 유일한 객체에서
-changedValues
을 쿼리한다면 rel A에 삽입 된 이후 rel A의 역함수가 변경되었다고 말할 수 있습니다. 서버에서 가져온 객체를 "default"또는 "last committed"상태를 나타내면, 핵심 데이터 컨텍스트 저장을 실행합니다. 변경된 값은 changedValues가 삽입을 더 이상 반영하지 않습니다. 여태까지는 그런대로 잘됐다. 다음으로 로컬로 (서버에서 가져 오기가 아니라) 2 개의 객체를 만듭니다. 나는 rel A에 하나를 삽입하고 (그것은 현재 2 개의 객체를 가짐) rel B에 다른 하나를 삽입합니다 (이제 1 개의 객체가 있음).
- 이 시점에서, 전체 시스템이 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에 삽입하고 내 자신의 코드를 통해 수동으로 처리합니다. 그것이 이미 컨텍스트와 관련하여 이미 관리 된 객체를 나타내는 플래그를 본질적으로 다시 사용하고 있기 때문에 실행 가능하지만 빈틈없는 게토처럼 보입니다.
어떤 생각이나 아이디어가 있습니까?
당신이 당신의 obj2보다에 과도 "더러운"속성을 추가 고려 유무 :
이 문서에서는이 작업을 코딩하는 방법에 대한 훌륭한 설명이 있습니다. 따라서 오름차순의 오르막 만 보낼 수 있습니다. 임시 속성은 저장소에 저장되지 않습니다. –
글쎄, 내가 어떻게 더러운, 삭제, 등등에 대한 몇 가지 플래그를 추가하는 질문의 끝을 향해 일종의 ... 일이 어떻게 일시적으로 더러운 BOOL 변경에 대해 갈 것이라고 때마다 개체가 관계에 추가되면 자동으로? 한 가지 생각은 nsmanagedobject에 대한 카테고리 일 것입니다. nsmanagedobject의 관계가 변경되면 더러운 bool이 yes로 설정되지만 비효율적 인 것으로 보입니다. – SaldaVonSchwartz