2014-12-17 4 views
1

오프라인 기능이있는 자동 동기화 응용 프로그램을 개발 중입니다. 사용자는 폴더 및 문서를 만들고 서버와 동기화 할 수 있습니다. 매 시간마다 서버와의 동기화가 백그라운드에서 자동으로 수행되는 자동 동기화 기능이 있습니다. 동기화 프로세스 중에 사용자는 폴더/문서를 생성, 삭제할 수 있습니다. 모든 변경 사항은 핵심 데이터에 저장됩니다. 변경 사항을 서버로 보내려면 bool을 유지해야합니다. bool이 NO이면 해당 항목을 서버로 보내고 수신 된 응답은 YES로 설정됩니다.iOS : 코어 데이터가있는 백그라운드에서 자동 동기화

이제 내 문제는 동기화가 진행되는 동안 서버에 전송 된 변경 사항을 어떻게 확인할 수 있는지입니다. 동기화가 진행 중이고 서버에서 전송 된 항목을 변경하면 동기화 bool이 NO로 설정 되어도 서버에서 NO 변경 사항이 다시 YES로 변경되고 이러한 변경 사항이 서버로 전송되지 않습니다.

참고 : 동기화가 진행되는 동안 사용자에게 어떤 제한도하고 싶지 않습니다.

어떻게하면됩니까?

+0

이 목적으로 특수 특성을 추가하는 것은 좋지 않은 생각입니다. 변경 세트는 다른 곳에 저장해야합니다. 또한 [Ensemble] (http://www.ensembles.io)를 사용하여 동기화하는 것이 좋습니다. –

+0

왜 특수 특성을 데이터베이스 외부에 저장하겠습니까? 그런 식으로 원 자성을 잃어 버리면 둘 사이의 위험이 무너집니다 ... –

답변

1

Google에서 구체적으로 어떻게 해결했는지 알려 드리겠습니다. 동기화 코드에서 사용자가 변경할 수있는 특정 객체의 모든 속성에는 연관된 '더티 플래그'가 있습니다. 사용자가 주 스레드 컨텍스트에서 객체의 속성을 변경할 때마다 설정되는 추가 부울입니다 (name은 nameDirty , 등). 이 부울은 컨텍스트의 변경 사전을 검사하고 적절하게 속성을 더티로 표시하는 컨텍스트 사전 저장 통지 옵저버를 기반으로 자동 설정됩니다.

당신이 지금까지 sync 플래그와 비슷하게 들렸지 만, 당신은 각 속성보다는 오브젝트 당입니다.

서버에서 변경 한 내용은 dirty 플래그가 YES로 설정된 속성으로 구문 분석되지 않습니다. 마찬가지로 변경 사항이 서버에 동기화 될 때마다 해당 플래그가 NO로 재설정되므로 서버의 변경 사항을 다시 수락합니다.

사용자가 주 컨텍스트를 변경하고 서버가 동시에 백그라운드 컨텍스트 (백그라운드 스레드)에서 변경 내용을 구문 분석하면 어떻게됩니까? 그것이 올바른 NSMergePolicy를 사용하는 곳입니다. 주 컨텍스트에는 메모리 내 변경 사항을 알려주는 병합 정책이있어 데이터베이스의 모든 것을 처리합니다. 마찬가지로, 동기화 컨텍스트에는 데이터베이스의 모든 값이 동기화 컨텍스트의 메모리 내 변경을 트랩하도록 알려주는 병합 정책이 있습니다. (동일한 사전 저장 훅 (pre-save hook)은 또한 동기화 컨텍스트를 파고 (pokes) 백그라운드에서 서버에 대한 모든 새로운 변경 사항을 동기화하도록 지시합니다.) 이는 동기화 프로세스가 사용자가 메인 스레드에서 방금 만든 변경 사항을 절대 수행 할 수 없도록 보장합니다. SQLite 수준의 병합 충돌.

여기에서 핵심은 사용자가 변경 한 컨텍스트와 서버 변경을 구문 분석하는 컨텍스트 간의 컨텍스트 분리입니다.이를 통해 매우 우선적으로 우선 순위를 지정하고 잘못된 병합이 발생하지 않도록 할 수 있습니다. 두 컨텍스트 모두 영구 저장소 코디네이터와 직접 연결됩니다.

Google의 동기화 프레임 워크 작동 방식에 대한 블로그 게시물을 작성하고 있지만 아직 완료되지 않았으므로 아직 링크가 없습니다.

거기에는 여러 가지 타사 동기화 라이브러리가 있습니다. 우리 고유의 요구 사항으로 인해 우리는 자체적으로 작성했지만, 사용자의 요구 사항에 맞는지 확인하는 것이 좋습니다.

+0

블로그를 완성 했습니까? 링크가 있다면 링크를 공유하십시오. –

관련 문제