Google에서 구체적으로 어떻게 해결했는지 알려 드리겠습니다. 동기화 코드에서 사용자가 변경할 수있는 특정 객체의 모든 속성에는 연관된 '더티 플래그'가 있습니다. 사용자가 주 스레드 컨텍스트에서 객체의 속성을 변경할 때마다 설정되는 추가 부울입니다 (name은 nameDirty , 등). 이 부울은 컨텍스트의 변경 사전을 검사하고 적절하게 속성을 더티로 표시하는 컨텍스트 사전 저장 통지 옵저버를 기반으로 자동 설정됩니다.
당신이 지금까지 sync 플래그와 비슷하게 들렸지 만, 당신은 각 속성보다는 오브젝트 당입니다.
서버에서 변경 한 내용은 dirty 플래그가 YES로 설정된 속성으로 구문 분석되지 않습니다. 마찬가지로 변경 사항이 서버에 동기화 될 때마다 해당 플래그가 NO로 재설정되므로 서버의 변경 사항을 다시 수락합니다.
사용자가 주 컨텍스트를 변경하고 서버가 동시에 백그라운드 컨텍스트 (백그라운드 스레드)에서 변경 내용을 구문 분석하면 어떻게됩니까? 그것이 올바른 NSMergePolicy를 사용하는 곳입니다. 주 컨텍스트에는 메모리 내 변경 사항을 알려주는 병합 정책이있어 데이터베이스의 모든 것을 처리합니다. 마찬가지로, 동기화 컨텍스트에는 데이터베이스의 모든 값이 동기화 컨텍스트의 메모리 내 변경을 트랩하도록 알려주는 병합 정책이 있습니다. (동일한 사전 저장 훅 (pre-save hook)은 또한 동기화 컨텍스트를 파고 (pokes) 백그라운드에서 서버에 대한 모든 새로운 변경 사항을 동기화하도록 지시합니다.) 이는 동기화 프로세스가 사용자가 메인 스레드에서 방금 만든 변경 사항을 절대 수행 할 수 없도록 보장합니다. SQLite 수준의 병합 충돌.
여기에서 핵심은 사용자가 변경 한 컨텍스트와 서버 변경을 구문 분석하는 컨텍스트 간의 컨텍스트 분리입니다.이를 통해 매우 우선적으로 우선 순위를 지정하고 잘못된 병합이 발생하지 않도록 할 수 있습니다. 두 컨텍스트 모두 영구 저장소 코디네이터와 직접 연결됩니다.
Google의 동기화 프레임 워크 작동 방식에 대한 블로그 게시물을 작성하고 있지만 아직 완료되지 않았으므로 아직 링크가 없습니다.
거기에는 여러 가지 타사 동기화 라이브러리가 있습니다. 우리 고유의 요구 사항으로 인해 우리는 자체적으로 작성했지만, 사용자의 요구 사항에 맞는지 확인하는 것이 좋습니다.
이 목적으로 특수 특성을 추가하는 것은 좋지 않은 생각입니다. 변경 세트는 다른 곳에 저장해야합니다. 또한 [Ensemble] (http://www.ensembles.io)를 사용하여 동기화하는 것이 좋습니다. –
왜 특수 특성을 데이터베이스 외부에 저장하겠습니까? 그런 식으로 원 자성을 잃어 버리면 둘 사이의 위험이 무너집니다 ... –