0

그래서 우리는 두 개의 NSManagedObjectContext가있는 app에서 context1과 context2를 호출 할 수 있습니다. customId = 1 인 객체가 context2에 삽입되고 context2가 절대로 저장되지 않는 상황이 있습니다. 미래의 어떤 시점에서 객체는 custom1 = 1과 함께 context1에 추가됩니다. 그런 다음 context1이 저장되고 완료 알림이 수신되면 재미가 시작됩니다! 우리는을 통해 context2으로 저장에서 변경 사항을 병합하려고이 잘 작동CoreData 병합 삽입

[context2 mergeChangesFromContextDidSaveNotification:notification]; 

, 그것은 병합을 수행하고하는 맞춤 = 1 context2 모두에서 두 개체가있다. 그러나, 내가 원하는 것은, 병합시, 두 개체가 동일한 customId를 가지므로 삽입을 수행하는 대신 기존 개체를 업데이트하고 내부적으로 두 개체를 동일하게 만듭니다 (또는 그 효과 : /). 나는 이것이 isEqual과 해시를 오버라이드함으로써 가능할 수 있다고 생각했지만 이것은 NSManagedObjects에 대해 엄격하게 금지되어있다!

또 다른 생각은 validateInsert :를 사용하는 것이었고 새로운 객체를 삽입하려고 할 때 값을 복사하지 않고 값을 복사한다고 알리는 것입니다. 그러나 이것은 또 다른 문제점을 야기합니다. 우리는 이제 하나의 객체를 가진 영속 저장소를 가지고 있고 context2는 다른 객체를 가지고있다. 그런 다음 context1에서 객체를 삭제하고 해당 변경 사항을 저장하여 영구 저장소에서 객체를 제거해야합니다. 그러나 context2를 저장하지 않으므로 (이상하게 보일 수 있지만 유효한 이유가 있습니다 ... 약속드립니다! 그 객체는 절대로 저장되지 않습니다.

우리는 기본적으로 CoreData에 두 개의 삽입이 이루어진 후에 실제로 동일한 객체라고 가정 할 수 있기를 원합니다! 우리가 어떻게 할 수 있을지에 대한 아이디어가 있다면 누구든지이 시점에서 도움을 청할 수 있습니다!

답변

1

이러한 유형의 병합 전략은 처리해야 할 대상이며 프레임 워크의 범위를 벗어납니다. 기본적으로 더러운 샌드 박스와 깨끗한 샌드 박스가 있습니다. 깨끗한 샌드 박스가 변경되면 더러운 곳으로 전파됩니다.

들어오는 변경 사항을 확인하고 이에 대한 조치를 취하는 것은 더러운 샌드 박스 소유자의 책임입니다. NSManagedObjectContextDidSaveNotification을 청취하고 충돌을 확인할 수 있습니다. 거기에서 다음에 발생할 일을 결정하는 것이 비즈니스 로직입니다.

+0

쿨한 느낌이었습니다. 답장을 보내 주셔서 감사합니다! –

관련 문제