Docs Menu
Docs Home
/ /
Atlas Device SDK
/ /

managed 동기화 세션 - Flutter SDK

이 페이지의 내용

  • 전제 조건
  • 변경 사항이 업로드 및 다운로드될 때까지 기다립니다.
  • 동기화 세션 일시 중지 및 다시 시작
  • 동기화 세션을 일시 중지해야 하는 경우
  • 동기화 업로드 및 다운로드 진행 상황 모니터링
  • 네트워크 연결 모니터링
  • 모든 동기화 세션에 수동으로 다시 연결

Atlas Device Sync를 사용하면 Flutter SDK는 동기화 세션을 사용하여 백그라운드에서 데이터를 Atlas와 동기화합니다. 동기화 세션은 동기화된 Realm을 열 때마다 시작됩니다.

동기화 세션은 다음을 managed.

  • 동기화된 데이터베이스에 변경 사항 업로드 및 다운로드

  • 동기화 일시 중지 및 다시 시작

  • 동기화 진행 상황 모니터링

  • 네트워크 연결 모니터링

세션 에 액세스 할 수 있습니다. 동기화된 모든 Realm의 Realm 영역 속성.

동기화 세션 상태를 managed하려면 먼저 다음을 수행해야 합니다.

  1. Atlas App Services 백엔드에서 Flexible Sync 구성

  2. 앱에 Realm Mobile Sync 추가

동기화된 영역에서 모든 변경 사항이 Atlas로 업로드될 때까지 비동기적으로 기다리려면 Session.waitForUpload() 를 호출합니다. . Atlas의 모든 변경 사항이 동기화된 영역에 다운로드될 때까지 비동기적으로 기다리려면 Session.waitForDownload()를 호출합니다.

// Wait to download all pending changes from Atlas
await realm.syncSession.waitForDownload();
// Add data locally
realm.write(() {
realm.addAll<Car>([
Car(ObjectId(), "Hyundai"),
Car(ObjectId(), "Kia"),
Car(ObjectId(), "Lincoln")
]);
});
// Wait for changes to upload to Atlas before continuing execution.
await realm.syncSession.waitForUpload();

선택 사항인 CancellationToken 을 추가할 수 waitForUpload() waitForDownload()있습니다. 및 로 설정합니다.

final cancellationToken = CancellationToken();
final waitForDownloadFuture =
realm.syncSession.waitForDownload(cancellationToken);
cancellationToken.cancel();
final waitForUploadFuture =
realm.syncSession.waitForUpload(cancellationToken);
cancellationToken.cancel();

세션 동기화를 일시 중지하려면 Session.pause(). 세션이 일시 중지되는 동안 Realm은 Atlas와 변경 사항을 동기화하지 않습니다.

변경 사항 동기화를 다시 시작하려면 Session.resume()을 호출합니다.

동기화 세션을 일시 중지했다가 다시 시작하려는 각 영역에 대해 Session.pause()Session.resume() 를 수동으로 호출해야 합니다. 한 세션의 동기화 상태는 열려 있는 다른 세션에 영향을 주지 않습니다.

다음 코드 블록에서는 이러한 메서드를 호출하는 방법을 보여 줍니다.

// Pause the sync session
realm.syncSession.pause();
// Data that you add while the sync session is paused does not sync to Atlas.
// However, the data is still added to the realm locally.
realm.write(() {
realm.addAll<Car>([
Car(ObjectId(), "Volvo"),
Car(ObjectId(), "Genesis"),
Car(ObjectId(), "VW")
]);
});
// Resume sync session. Now, the data you wrote to the realm
// syncs to Atlas.
realm.syncSession.resume();

대부분의 애플리케이션은 동기화 세션을 수동으로 일시 중지했다가 다시 시작할 필요가 없습니다. 그러나 동기화 세션을 일시 중지하거나 일시 중지해야 하는 몇 가지 상황이 있습니다.

  • 사용자가 특정 조치를 취한 후에만 동기화하려는 경우

  • 하루 중 특정 시간에만 동기화하려는 경우

  • 네트워크 연결이 좋지 않을 때 동기화를 시도하고 싶지 않은 경우

  • 동기화 세션을 명시적으로 강제로 연결하려는 경우

네트워크 연결이 좋지 않은 경우 계속해서 네트워크 연결을 설정하려고 하면 사용자의 장치 배터리가 소모될 수 있습니다.

동기화 세션을 연결하도록 명시적으로 강제하는 경우는 가장 일반적으로 일정 시간 동안 오프라인 상태인 것과 관련이 있습니다. 동기화 클라이언트는 연결을 시도하지만 실패 시 지수 백오프 상태가 됩니다. 클라이언트가 오랫동안 오프라인 상태였다가 즉시 다시 연결되지 않을 수 있습니다. 동기화 세션을 일시 중지했다가 다시 시작하면 명시적으로 연결이 강제로 적용됩니다.

동기화 세션을 일시 중지할 때는 다음 사항에 유의하세요.

  • 클라이언트가 클라이언트 최대 오프라인 시간 보다 오래 오프라인 상태일 수 있는 경우 클라이언트는 동기화를 다시 시작할 수 없으며 클라이언트 재설정을 수행해야 합니다.

  • 동기화 세션을 일시 중지하면 양쪽 방향에서 모두 일시 중지됩니다. 앱이 기기에서 수행하는 변경 사항은 백엔드 동기화되지 않으며, 백엔드 또는 다른 기기에서 변경한 데이터는 기기에 동기화되지 않습니다. 업로드만 일시 중지 또는 다운로드만 일시 중지할 수 있는 방법은 없습니다.

  • 클라이언트가 백엔드와의 동기화를 영구적으로 중지하도록 하려면 동기화 세션을 일시 중지하지 마세요. 동기화를 영구적으로 중지하려면 동기화된 영역의 콘텐츠를 동기화되지 않은 영역에 복사하고 클라이언트에서 동기화되지 않은 영역을 사용합니다.

무기한 또는 월 및 연도 단위의 시간 범위 동안 동기화를 중지하기 위해 동기화를 일시 중지 하지 마세요 . 이 사용 사례에 맞게 기능이 설계되거나 테스트되지 않았습니다. 이러한 방식으로 사용하면 다양한 문제가 발생할 수 있습니다.

버전 2.0.0에서 변경됨: transferredBytestransferrableBytes 가 더 이상 사용되지 않으며 progressEstimate로 대체됨

동기화 진행 상황을 모니터링하려면 SyncSession.getProgressStream(). 이 메서드는 SyncProgress 스트림을 progressEstimate 반환합니다. 현재 업로드 또는 다운로드에 를 제공하는 객체입니다.

제공된 progressEstimate 은 값 범위가 0.0 에서 1.0 사이인 double 입니다. 1.0 에서 진행 스트림이 완료됩니다.

SyncSession.getProgressStream() 두 개의 인수를 사용합니다:

  • ProgressDirection 또는 로 설정할 수 있는 upload download열거형입니다. 진행률 스트림이 업로드 또는 다운로드 진행률을 모니터링할지 여부를 지정합니다.

  • ProgressMode 열거형을 다음 중 하나로 설정할 수 있습니다.

    • reportIndefinitely: 콜백이 등록 취소될 때까지 알림이 계속되도록 설정합니다.

    • forCurrentlyOutstandingWork: progressEstimate1.0 에 도달할 때까지 알림이 계속되도록 설정합니다.

final stream = realm.syncSession.getProgressStream(
ProgressDirection.upload, ProgressMode.forCurrentlyOutstandingWork);
double progressEstimate = -1;
late StreamSubscription streamListener;
streamListener = stream.listen((syncProgressEvent) {
progressEstimate = syncProgressEvent.progressEstimate;
if (progressEstimate < 1.0) {
print('Upload progress: ${progressEstimate * 100}%');
}
}, onDone: () {
print('Upload progress: ${progressEstimate * 100}%');
print("Upload complete");
}, onError: (error) {
print("An error occurred: $error");
streamListener.cancel();
});

Realm 을 처음 열 때 onProgressCallback 을 사용하여 동기화 모니터링 을 구성할 수도 있습니다.

Session.connectionState 를 사용하여 현재 네트워크 연결 상태를 가져올 수 있습니다. . ConnectionStateconnected disconnected connecting반환합니다. 네트워크 연결 상태가 포함된 열거형 , 또는 .

if (realm.syncSession.connectionState == ConnectionState.connected) {
// ... do stuff
}

Session.connectionStateChanges 를 사용하여 네트워크 연결 상태를 모니터링합니다. . 이 속성은 ConnectionStateChange 의 스트림을 반환합니다. 네트워크 연결이 변경될 때 업데이트되는 객체입니다. ConnectionStateChange 에서 현재 및 이전 ConnectionState 에 액세스할 수 있습니다.

final connectionStream = realm.syncSession.connectionStateChanges;
late StreamSubscription streamListener;
streamListener = connectionStream.listen((connectionStateChange) {
if (connectionStateChange.current == ConnectionState.connected) {
print("Connected to Atlas Device Sync server");
streamListener.cancel();
}
});

Flutter SDK는 기기가 오프라인 상태였다가 다시 연결되면 자동으로 이를 감지하고, 증분 백오프 전략을 사용하여 다시 연결을 시도합니다.

App.reconnect() 메서드 를 사용하여 재연결 시도를 수동으로 하도록 선택할 수 있습니다. 증분 백오프 기간을 기다리는 대신 trigger 이는 네트워크 상태를 더 정확하게 이해하고 있고 자동 재연결 감지에 의존하고 싶지 않은 경우에 유용합니다.

app.reconnect();

이 메서드를 호출하면 SDK는 모든 동기화 세션이 즉시 재연결을 시도하도록 강제하고 증분 백오프에 사용되는 모든 타이머를 재설정합니다.

중요

소켓 읽기 제한 시간 내에 다시 연결할 수 없음

Flutter SDK의 내부 기본 소켓 읽기 타임아웃은 2분이며, 읽기 작업이 2분 창 내에 데이터를 수신하지 않으면 SDK가 타임아웃됩니다. 해당 창 내에서 App.Sync.reconnect() 를 호출하면 Flutter SDK는 다시 연결을 시도하지 않습니다 .

돌아가기

동기화된 Realm에 데이터 쓰기