기본적으로이 경우 고아 오브젝트를 처리하려고합니다.Restkit이 매핑 작업을 수행하기 전에 코어 데이터의 기존 개체를 삭제하십시오.
핵심 데이터 저장소에 기존 개체가 있습니다. 그리고 API 요청 작업을 수행하기 전에 특정 개체에 대한 모든 개체를 삭제합니다. 따라서 서버에서 새 객체를 가져 오면 내 로컬 데이터가 서버에서받은 새 데이터 객체와 동기화됩니다.
하지만 내 API 요청 작업이 실패 할 경우가있을 수 있습니다. 이 경우 로컬 데이터베이스에서 기존 개체를 잃을 여유가 없습니다. 그래서 나는 그것을 위해 실행 취소 작업을 사용하는 것을 고려했다.
이제 이것을 수행하기 위해 setWillMapDeserializedResponseBlock
을 사용해 보았습니다. (이 블록은 API 작업이 성공적으로 완료되고 restkit이 매핑을 수행하기 직전에 실행 됨)
따라서이 블록에서 개체의 기존 개체를 삭제합니다.
그러나 매핑이 완료된 후 서버 응답에서 누락되었지만 로컬 저장소에 있었던 개체는 여전히 존재합니다. (따라서 로컬 저장소에서 기존 개체를 삭제해도 저장소에 영향을주지 않습니다.) setWillMapDeserializedResponseBlock
에서 saveToPersistantStore
메서드를 명시 적으로 호출 한 후에 변경 내용이 반영되지 않습니다.
이 setWillMapDeserializedResponseBlock
입니다 :
{
// start undo grouping
[[[NSManagedObjectContext MR_defaultContext] undoManager] beginUndoGrouping];
[[[NSManagedObjectContext MR_defaultContext] undoManager] setActionName:@"undo deleting objects"];
// perform deletion of objects
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"..."];
[Entity MR_deleteAllMatchingPredicate:predicate];
// end undo grouping
[[[NSManagedObjectContext MR_defaultContext] undoManager] endUndoGrouping];
}
이 어떻게 다른 방식으로이 문제를 접근 할 수 ? 업데이트
: 계층 구조와 같은 나무의 실체가 많이 있기 때문에
요청 블록을 가져 오기 사용은 가능하지 않습니다.
RootEntity
- identifier
EntityB
- root_identifier
EntityC
- b_identifier
EntityD
- c_identifier
API 호출에 대한 매개 변수는 RootEntity위한 식별자 인 다음과 같은 코어 데이터
내 구조이다. 응답에 모든 항목이 있습니다. FetchRequests는 RootEntity
의 식별자를 저장하는 특성을 가지고 있으므로 RootEntity
및 EntityB
에 대해 쉽게 작성할 수 있습니다. 그러나 EntityC
과 EntityD
의 경우 RootEntity
과 직접적인 관련이 없으므로 가져 오기 요청을 작성하기가 어려워집니다.
또한 관계에서 계단식 삭제를 설정했습니다. 따라서 rootEntity가 삭제되면 모든 자식이 삭제됩니다. 나는이 삭제가 가져 오기 요청을하는 것보다 비용이 적을 것이라고 생각한다.
업데이트 된 질문을 확인하십시오! –
업데이트에 대해 자세히 설명해주십시오. 구조에서 페치 요청 블록이 문제가되는 것은 무엇입니까? – Wain
질문을 필요한 설명으로 업데이트했습니다! 도움이되는지 알려주세요. 감사 –