2013-07-19 2 views
1

MMC와 BMC가 동일한 영구 저장소를 가리키는 두 개의 관리되는 개체 컨텍스트가 있습니다. 각각 메인 스레드 (MT)와 백그라운드 스레드 (BT)로 생성됩니다.하나의 관리 컨텍스트에만 저장 다른 관리 개체 컨텍스트에는 변경 사항이 없습니다.

두 엔티티 모두에서 변경되는 모든 엔티티에 델타와 리비전 번호 필드가 두 개 있습니다.

이제 BT는 영구 저장소에서 객체 obj1의 값을 가져 와서 서버에 게시합니다. 서버가 응답하면 obj1에 새로운 델타와 새로운 개정 번호가 제공됩니다.

또한 BT가 서버로 이동하는 동안 MMC의 값은 수정되지만 영구 저장소에는 저장되지 않습니다.

서버에서 영구 저장소로 반환 된 델타 및 개정 번호를 저장하려고합니다. 백그라운드 스레드가 서버로 이동하는 동안 MMC에서 개정 번호가 변경되지 않은 경우에만 저장하십시오.

MMC의 델타 및 개정 번호를 유지하고 싶다면.

나는 어떻게 이것을 달성 할 수 있습니까?

답변

1

변경 사항을 저장하기 만하면 각 스레드가 다른 스레드의 컨텍스트에 대해 NSManagedObjectContextDidSaveNotification을 관찰하고 올바른 병합 정책을 사용하는지 확인하십시오. 백그라운드 스레드가 변경 사항을 저장하면 주 스레드가 알림을 받고 mergeChangesFromContextDidSaveNotification:을 호출합니다. 그 다음 :

  • "MMC"에 변경이 없다면 : 완료. 다른 일은 발생하지 않지만 MMC가 업데이트 된 개체를로드하면 서버에서받은 값을 가져옵니다.
  • 이 "MMC"에서 변경 사항 인 경우 : "MMC"의 병합 정책이 NSMergeByPropertyObjectTrumpMergePolicy 인 경우 MMC에서 저장하지 않은 변경 내용이 유지됩니다. 영구 저장소에는 서버의 값이 있지만 MMC에서 변경 내용을 저장하면 MMC의 값이 해당 값을 덮어 씁니다.

결과적으로 서버에서 변경 사항을 저장할 때마다 MMC에서 새로운 변경 사항이 손실되지 않습니다. 거기에서 저장하면 곧바로 새로운 값이 입력됩니다.