managed 동기화 세션 - C++ SDK
이 페이지의 내용
Atlas Device Sync를 사용하면 Realm C++ SDK는 동기화 세션을 사용하여 백그라운드에서 데이터를 Atlas와 동기화합니다. 동기화 세션은 동기화된 영역을 열 때 시작됩니다.
동기화 세션은 다음을 managed.
영역에 변경 사항 업로드 및 다운로드
동기화 상태 모니터링
전제 조건
동기화 세션 상태를 managed하려면 먼저 다음을 수행해야 합니다.
동기화 세션 가져오기
멤버 함수 get_sync_session() 을 사용하여 동기화된 모든 영역 에 대한 sync_session 객체 를 가져올 수 있습니다. SDK는 이 객체 를 선택 사항으로 반환합니다. 값으로 전달할 수 있는 경량 처리하다 입니다.
auto syncSession = realm.get_sync_session();
네트워크 연결 확인
팁
SDK의 오프라인 우선 설계는 일반적으로 현재 네트워크 연결 상태를 확인할 필요가 없음을 의미합니다. 즉, connection_state()
속성은 앱이 연결 상태 표시를 요청하는 경우 사용할 수 있습니다.
연결 상태를 확인하려면 동기화 세션 인스턴스의 connection_state()
속성을 직접 읽으면 됩니다.
syncSession->connection_state();
관찰_연결 _변경() 함수를 사용하여 연결 상태를 관찰할 수도 있습니다. 이 함수는 기본 동기화 세션이 연결 상태를 변경할 때 SDK가 호출하는 콜백을 등록합니다.
auto connectionToken = syncSession->observe_connection_change( [&](enum realm::sync_session::connection_state, enum realm::sync_session::connection_state new_state) { // Register a block to execute when connection state changes. });
연결 변경 리스너를 등록한 경우 변경 사항 수신이 완료되면 등록을 취소할 수 있습니다. 동기화 세션 인스턴스의 unregister_connection_change_observer() 메서드를 호출하여 관찰 토큰 등록을 취소합니다.
syncSession->unregister_connection_change_observer(connectionToken);
네트워크 연결 상태는 state()
메서드로 확인할 수 있는 Realm Mobile Sync 연결 상태와 다릅니다. 동기화 연결 상태에 대한 자세한 내용은 이 페이지의 동기화 상태 확인 문서를 참조하세요.
동기화 세션 일시 중지 또는 재개
Realm에서 동기화 세션을 일시 중지했다가 다시 시작할 수 있습니다. 동기화 세션을 일시 중지하면 해당 Realm의 동기화 세션만 일시 중단됩니다. 열려 있는 Realm이 두 개 이상 있는 경우 일시 중단해도 다른 Realm의 동기화 세션에는 영향을 주지 않습니다.
동기화 세션을 일시 중지하려면 동기화 세션의 pause() 메서드를 호출합니다.
syncSession->pause();
동기화 세션을 재개하려면 동기화 세션의 resume() 메서드를 호출합니다.
syncSession->resume();
동기화 세션을 일시 중지해야 하는 경우
대부분의 애플리케이션은 동기화 세션을 수동으로 일시 중지했다가 다시 시작할 필요가 없습니다. 그러나 동기화 세션을 일시 중지하거나 일시 중지해야 하는 몇 가지 상황이 있습니다.
사용자가 특정 조치를 취한 후에만 동기화하려는 경우
하루 중 특정 시간에만 동기화하려는 경우
네트워크 연결이 좋지 않을 때 동기화를 시도하고 싶지 않은 경우
동기화 세션을 명시적으로 강제로 연결하려는 경우
네트워크 연결이 좋지 않은 경우 계속해서 네트워크 연결을 설정하려고 하면 사용자의 장치 배터리가 소모될 수 있습니다.
동기화 세션을 연결하도록 명시적으로 강제하는 경우는 가장 일반적으로 일정 시간 동안 오프라인 상태인 것과 관련이 있습니다. 동기화 클라이언트는 연결을 시도하지만 실패 시 지수 백오프 상태가 됩니다. 클라이언트가 오랫동안 오프라인 상태였다가 즉시 다시 연결되지 않을 수 있습니다. 동기화 세션을 일시 중지했다가 다시 시작하면 명시적으로 연결이 강제로 적용됩니다.
동기화 세션을 일시 중지할 때는 다음 사항에 유의하세요.
클라이언트가 클라이언트 최대 오프라인 시간 보다 오래 오프라인 상태일 수 있는 경우 클라이언트는 동기화를 다시 시작할 수 없으며 클라이언트 재설정을 수행해야 합니다.
동기화 세션을 일시 중지하면 양쪽 방향에서 모두 일시 중지됩니다. 앱이 기기에서 수행하는 변경 사항은 백엔드 와 동기화되지 않으며, 백엔드 또는 다른 기기에서 변경한 데이터는 기기에 동기화되지 않습니다. 업로드만 일시 중지 또는 다운로드만 일시 중지할 수 있는 방법은 없습니다.
클라이언트가 백엔드와의 동기화를 영구적으로 중지하도록 하려면 동기화 세션을 일시 중지하지 마세요. 동기화를 영구적으로 중지하려면 동기화된 영역의 콘텐츠를 동기화되지 않은 영역에 복사하고 클라이언트에서 동기화되지 않은 영역을 사용합니다.
무기한 또는 월 및 연도 단위의 시간 범위 동안 동기화를 중지하기 위해 동기화를 일시 중지 하지 마세요 . 이 사용 사례에 맞게 기능이 설계되거나 테스트되지 않았습니다. 이러한 방식으로 사용하면 다양한 문제가 발생할 수 있습니다.
변경 사항이 업로드 및 다운로드될 때까지 기다립니다.
sync_session 의 wait_for_upload_completion()
및 wait_for_download_completion()
메서드를 사용하여 변경 사항이 Atlas에 업로드되거나 Atlas 에서 다운로드 될 때까지 기다릴 수 있습니다. 이 두 메서드 모두 업로드 또는 다운로드 가 완료되면 선택적으로 콜백 을 받아 실행할 수 있습니다.
모든 변경 사항이 동기화된 영역에서 Atlas로 업로드될 때까지 기다리려면 wait_for_upload_completion()
멤버 함수를 사용합니다.
syncSession->wait_for_upload_completion().get();
모든 변경 사항이 Atlas에서 동기화된 영역으로 다운로드될 때까지 기다리려면 wait_for_download_completion()
멤버 함수를 사용합니다. 변경 사항을 다운로드한 후 영역을 새로 고쳐 가장 최근 데이터가 반영되는지 확인합니다.
syncSession->wait_for_download_completion().get(); realm.refresh();
동기화 상태 확인
sync_session 의 공개 멤버 함수 state()
를 사용하여 동기화 세션이 활성 상태인지 확인할 수 있습니다. 가능한 Device Sync 상태를 반영하는 값의 열거형을 반환합니다.
syncSession->state();
동기화 연결 상태는 connection_state()
메서드로 확인할 수 있는 네트워크 연결 상태와 다릅니다. 네트워크 연결 상태에 대한 자세한 내용은 이 페이지의 네트워크 연결 확인 문서를 참조하세요.
모든 동기화 세션에 수동으로 다시 연결
Realm은 장치가 오프라인 상태였다가 다시 연결되면 자동으로 감지하고 증분 백오프 전략을 사용하여 다시 연결을 시도합니다.
증분 백오프 기간 trigger 동안 기다리는 대신 동기화 세션의 reconnect() 메서드를 사용하여 재연결 시도를 수동으로 하도록 선택할 수 있습니다. 이는 네트워크 상태를 더 정확하게 이해하고 있고 Realm의 자동 재연결 감지에 의존하고 싶지 않은 경우에 유용합니다.
syncSession->reconnect();
이 메서드를 호출하면 SDK는 모든 동기화 세션이 즉시 재연결을 시도 하도록 강제합니다. 이렇게 하면 증분 백오프에 사용되는 모든 타이머가 재설정됩니다.
이 메서드를 호출한다고 해서 기기의 재연결이 보장되는 것은 아닙니다. SDK에 치명적인 오류가 발생하거나 장치가 이미 연결되었거나 연결을 시도하는 경우 이 메서드를 호출해도 아무런 효과가 없습니다.
중요
소켓 읽기 제한 시간 내에 다시 연결할 수 없음
Realm의 내부 기본 소켓 읽기 제한 시간은 2분이며, 읽기 작업이 2분 창 내에 데이터를 수신하지 않으면 Realm이 시간 초과됩니다. 해당 창 내에서 reconnect()
을(를) 호출하면 SDK는 다시 연결을 시도하지 않습니다 .