托管同步会话 — C++ SDK
当您使用 Atlas Device Sync 时,Realm C++ SDK 使用同步会话在背景与 Atlas 同步数据。当您打开同步 Realm 时,同步会话就会启动。
同步会话管理以下内容:
上传和下载对 Realm 的更改
监控同步状态
先决条件
在托管同步会话状态之前,您必须:
获取同步会话
您可以使用成员函数get_sync_session()来获取任何同步域的sync_session对象。 SDK 将此对象作为可选项返回。 它是一个轻量级处理,可以按值传递。
auto syncSession = realm.get_sync_session();
检查网络连接
提示
SDK 的离线优先设计意味着您通常不需要检查当前的网络连接状态。 也就是说,如果您的应用程序需要某些连接状态指示,则 connection_state()
属性可用。
要检查连接状态,可以直接读取同步会话实例的connection_state()
属性。
syncSession->connection_state();
您还可以使用watch_connection_change()函数观察连接状态。 此函数注册一个回调,当底层同步会话更改其连接状态时,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);
网络连接状态与 Device Sync 连接状态不同,您可以使用state()
方法检查后者。 有关同步连接状态的更多信息,请参阅本页上的“检查同步状态”文档。
暂停或恢复同步会话
您可以暂停和恢复 Realm 上的同步会话。 暂停同步会话只会暂停该 Realm 的同步会话。 如果您有多个打开 Realm,则暂停不会影响其他 Realm 的同步会话。
要暂停同步会话,请调用同步会话的Pause()方法。
syncSession->pause();
要恢复同步会话,请调用同步会话的resume()方法。
syncSession->resume();
何时暂停同步会话
对于大多数应用程序,无需手动暂停和恢复同步会话。 但是,在某些情况下,您可能希望暂停或暂停同步会话:
您只想在用户执行特定操作后进行同步
您只想在一天中的特定时间进行同步
您不想在网络连接较差时尝试同步
您想要显式强制同步会话连接
在网络连接较差的情况下,不断尝试建立网络连接可能会耗尽用户的设备电池。
显式强制同步会话连接的情况最常见与离线一段时间有关。同步客户端尝试连接,一旦失败,就会Go指数退避状态。长时间离线后,客户端可能无法立即重新连接。 暂停和恢复同步会话会显式强制连接。
当您暂停同步会话时,请记住以下事项:
暂停同步会话会使其在两个方向上暂停。您的应用在设备上所做的更改不会与后端同步,对后端或其他设备上的数据的更改也不会同步到设备。 无法仅暂停上传或仅暂停下载。
如果您希望客户端永久停止与后端同步,请勿暂停同步会话。 要永久停止同步,请将同步 Realm 的内容复制到非同步 Realm,并在客户端中使用该非同步 Realm。
请勿在不确定的时间段或以月和年为单位的时间范围内通过暂停同步来停止同步。 该功能不是针对这些使用案例而设计或测试的。 以这种方式使用时,您可能会遇到一系列问题。
等待更改上传和下载
您可以使用sync_session的wait_for_upload_completion()
和wait_for_download_completion()
方法等待更改上传到 Atlas 或从Atlas下载。 这两个方法都可以选择在上传或下载完成时执行回调。
要等待所有更改从同步域上传到Atlas,请使用成员函数wait_for_upload_completion()
。
syncSession->wait_for_upload_completion().get();
要等待所有更改从 Atlas 下载到同步 Realm,请使用成员函数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不会尝试重新连接。