managed 동기화 세션 - Flutter SDK
이 페이지의 내용
Atlas Device Sync를 사용하면 Flutter SDK는 동기화 세션을 사용하여 백그라운드에서 데이터를 Atlas와 동기화합니다. 동기화 세션은 동기화된 Realm을 열 때마다 시작됩니다.
동기화 세션은 다음을 managed.
동기화된 데이터베이스에 변경 사항 업로드 및 다운로드
동기화 일시 중지 및 다시 시작
동기화 진행 상황 모니터링
네트워크 연결 모니터링
세션 에 액세스 할 수 있습니다. 동기화된 모든 Realm의 Realm 영역 속성.
전제 조건
동기화 세션 상태를 managed하려면 먼저 다음을 수행해야 합니다.
변경 사항이 업로드 및 다운로드될 때까지 기다립니다.
동기화된 영역에서 모든 변경 사항이 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에서 변경됨: transferredBytes
및 transferrableBytes
가 더 이상 사용되지 않으며 progressEstimate
로 대체됨
동기화 진행 상황을 모니터링하려면 SyncSession.getProgressStream(). 이 메서드는 SyncProgress 스트림을 progressEstimate
반환합니다. 현재 업로드 또는 다운로드에 를 제공하는 객체입니다.
제공된 progressEstimate
은 값 범위가 0.0
에서 1.0
사이인 double 입니다. 1.0
에서 진행 스트림이 완료됩니다.
SyncSession.getProgressStream()
두 개의 인수를 사용합니다:
ProgressDirection 또는 로 설정할 수 있는
upload
download
열거형입니다. 진행률 스트림이 업로드 또는 다운로드 진행률을 모니터링할지 여부를 지정합니다.ProgressMode 열거형을 다음 중 하나로 설정할 수 있습니다.
reportIndefinitely
: 콜백이 등록 취소될 때까지 알림이 계속되도록 설정합니다.forCurrentlyOutstandingWork
:progressEstimate
가1.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 를 사용하여 현재 네트워크 연결 상태를 가져올 수 있습니다. . ConnectionState 를connected
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는 다시 연결을 시도하지 않습니다 .