【问题标题】:Realm Sync offline-first on React Native: how to implement?React Native 上的 Realm Sync 离线优先:如何实现?
【发布时间】:2021-07-20 10:35:31
【问题描述】:

我正在开发一个offline-first 应用,在 React Native 上使用 Realm Sync。

我要解决的具体编程问题是如何在我的应用程序中使用 React Native 实现这种离线优先的行为,以便登录用户无论是在线还是离线都能获得无缝体验。我正在寻找代码,以说明使用实现此功能的 Realm Sync 离线优先的最佳实践。

其他优秀的 Realm 文档在离线优先和 demo app in the MongoDB Realm documentation 实现同步时非常有限,但不是为离线而设计的。当然,我的出发点是那个应用程序,因为它是文档和论坛中推荐的应用程序。

我已经测试了 iOS Swift 和 React Native 'Task Tracker' 应用程序,但他们的工程师证实了这一点,他们目前没有离线优先功能。

来自该应用的TaskProvider.js 中的重要代码是:

useEffect(() => {
    const config = {
      sync: {
        user: user,
        partitionValue: projectPartition,
      },
    };
    // open a realm for this particular project
    Realm.open(config).then((projectRealm) => {
      realmRef.current = projectRealm;

      const syncTasks = projectRealm.objects("Task");
      let sortedTasks = syncTasks.sorted("name");
      setTasks([...sortedTasks]);
      sortedTasks.addListener(() => {
        setTasks([...sortedTasks]);
      });
    });

    // ...
  }, [user, projectPartition]);

由于我需要在自己的应用程序中使用这样的代码,第一个问题是如何更改此代码以正确执行离线优先使用。此外,如果您有一个离线优先的 Realm Sync 应用程序可以在 React Native 上工作,请提供链接或相关示例代码。

【问题讨论】:

  • 这个问题有点不清楚,但可能是因为术语。当使用 Realm Sync 词时,表示应用程序始终处于离线状态,但也有在线同步组件。 Task Tracker 应用程序将其所有数据存储在您的设备上(离线),然后在后台同步,它肯定首先是离线的。 Realm Sync 教程就是这样 - 适用于 Sync 情况。如果您想专注于本地存储的数据,请忽略它并通过常规的 Quick Start 指南。
  • 哦,只是让您知道问题是否已关闭(不是我),要求教程被视为 OT - 来自Help 要求我们推荐或查找书籍的问题,工具、软件库、教程或其他场外资源对于 Stack Overflow 来说是无关紧要的,因为它们往往会吸引固执己见的答案和垃圾邮件。相反,请描述问题以及迄今为止为解决该问题所做的工作。 - 所以重新表述问题可能是一个好主意。
  • @Jay 您显然从未尝试过网站上的任何任务跟踪器示例应用程序。我已经测试了上面链接的 iOS Swift 和 React Native 'Task Tracker' 应用程序,它们绝对不是当前实现的离线优先功能。 - 在应用程序的“项目”视图中尝试断开网络连接。然后单击应该显示任务列表的“我的项目”。在 React Native 中,它将显示一个空列表,而 iOS Swift 实现将在离线时停止响应。
  • @Jay Real Sync 理论上的功能(我同意“离线优先”)与示例任务跟踪器应用程序中演示的功能之间存在差异,该示例几乎没有可用的离线功能功能。如果您精通 Realm Sync 编程,请分享一些您实际实现的示例代码。 - 经过一些研究,我创建了一个 PR,它将使 Task Tracker 应用程序比当前实现更具有离线功能。 - 我几乎可以将我的问题重新表述为错误报告,因为这可能被视为离线优先平台的错误。
  • 另一个需要考虑的数据点:我有一个 TaskTracker 应用程序,它与 Swift 教程中的应用程序非常相似。我在 MacBook 上安装了该应用程序并运行它。我在应用程序中登录了我的帐户并创建了两个任务,然后在几秒钟后检查了 Realm Console,它们就在那里(同步)。然后我关闭了 WiFi - 模拟网络中断。我在应用程序中创建了另外两个任务来检查“首先离线”。最后,我重新启用了无线,并在几秒钟内 Realm 完成了它的工作并将这两个任务同步到服务器。所以它应该对我有用。

标签: mongodb react-native realm offline


【解决方案1】:

我提交了一个 PR,它使示例 Task Tracker App by MongoDB Realm Sync 更加离线。这不是一个完整的解决方案,但它解决了离线时无法访问任务列表的主要问题。

重要的一点是,要在后台同步更改 Realm 需要同步而不是异步打开。

TaskProvider.js 的新代码与下面链接的文档中的 cmets:

  useEffect(() => {
    // You may want to sync changes in the background to display partial data to
    // the user while the synced realm downloads data from the server,
    // preventing the user experience from being blocked. We recommend syncing
    // changes in the background for applications in which the user's device
    // may go offline.
    const OpenRealmBehaviorConfiguration = {
      type: 'openImmediately',
    };
    // Create a Configuration object, which must include the sync property
    // defining a SyncConfiguration object. Set this
    // OpenRealmBehaviorConfiguration object as the value for the
    // newRealmFileBehavior and existingRealmFileBehavior fields of
    // the SyncConfiguration.
    const config = {
      sync: {
        user: user,
        partitionValue: projectPartition,
        // The behavior to use when this is the first time opening a realm.
        newRealmFileBehavior: OpenRealmBehaviorConfiguration,
        // The behavior to use when a realm file already exists locally,
        // i.e. you have previously opened the realm.
        existingRealmFileBehavior: OpenRealmBehaviorConfiguration,
      },
    };

    // open a realm for this particular project
    Realm.open(config).then((projectRealm) => {
      realmRef.current = projectRealm;

      const syncTasks = projectRealm.objects('Task');
      let sortedTasks = syncTasks.sorted('name');
      setTasks([...sortedTasks]);
      sortedTasks.addListener(() => {
        setTasks([...sortedTasks]);
      });
    });

    //...
  }, [user, projectPartition]);

Sync Changes Between Devices - React Native SDK — MongoDB Realm

更多细节在这里:enable offline-first in TaskProvider, syncing changes in the background by agape-apps · Pull Request #9 · mongodb-university/realm-tutorial-react-native · GitHub

这仍然有 PR 中所述的重大限制。因此,我继续从那些使用 Realm Sync 和 React Native 的离线优先应用程序中寻找更完整的实现细节或代码示例。

【讨论】:

  • 在 swift 版本中,任务在离线时随时可用 - 只需现场测试即可。
  • 太好了,您也测试了 Swift 版本。那是我链接到的未修改的 Task Tracker 演示应用程序,还是您在上面的评论中提到的您自己的实现?您自己的实现可能在离线优先功能方面有所不同。 --- 我正在在线/离线测试中运行未修改的 Task Tracker 演示应用程序:我在应用程序的 Projects 视图中断开网络连接。然后单击应该显示任务列表的“我的项目”。该应用程序只是在离线时停止响应。它不会进入任务列表并记录错误。 (续...)
  • 它几乎是一个克隆——唯一的区别是我在 macOS 上运行它,所以一些 UI 元素略有不同(UITextField 与 NSTextField)等。话虽如此,我一直在使用 Realm很多年了,所以我的项目可能是基于大约一年前的代码。让我抓住当前版本并尝试一下。
  • 显示的错误是:“Task Tracker[7805:412271] Sync: Connection[18]: Failed to connect to 'ws.realm.mongodb.com:443': All endpoints failed”。唯一可以离线工作的屏幕是“我的项目的任务”屏幕,我可以在其中添加任务,当我重新上线时,它们将被上传。但是,如果我离开该屏幕,即使我仍然登录,我也无法在离线时返回它。 - 我也向 MongoDB 的工程师描述了这种可重现的行为,他们通过他们的客户支持确认了 React Native,并承诺改进几周后的版本。
  • 听起来您可能在教程应用中发现了一个错误(谢谢!);如果是这样,那只是他们的编码不好。但这与领域是否设计为离线第一数据库无关。来自问题:“您的数据始终在本地写入,然后同步到服务器虽然这在营销材料中有所说明,但 事实并非如此” - 不符合您的要求刚刚说了我可以在哪里添加任务,当我重新上线时它们将被上传。看?他们编写演示应用程序的一个明显错误与 Realm 没有先离线写入数据不对应。
猜你喜欢
  • 2018-11-15
  • 2022-11-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多