当前位置: 首页 > 知识库问答 >
问题:

如何准确地合并多个流在Firebase firest

牛骞仕
2023-03-14

在你说这是一个重复的问题或者我应该使用嵌套流生成器之前,请听我说完。

我正在设计一个社交媒体类型的应用程序。我希望用户在关注其“我的追随者帖子”集合中的帖子时能够收到更新。在该应用程序中,该应用程序将检查firebase rtdb中当前用户的以下列表(他正在跟踪的人),并列出他们的UID。

我计划使用所述列表创建一个流列表(当然是按时间排序的),并将它们合并到一个流中,然后将其输入到私有提要页面上的流生成器中。

在此页面上,用户将能够轻松关注他们感兴趣的人发布的内容。

我认为这样一个系统比每个在“私人订阅源”集合中拥有文档的用户都更具成本效益,每当有人发布内容时,应用程序都会读取他们的关注者列表,然后迅速在他们的每个私人订阅源中发布更新。因为想象一个拥有200万粉丝的人。这意味着200万次即时写作。后来,200万人阅读。我认为,海报只需将帖子放在他们的“publicFeed”中,而不同的关注者只需收听该feed并与他们保持联系,这样会更具成本效益。

但是这需要实现多个流(多于2个)的合并。我该怎么做?

我尝试过阅读RxDart,但对我来说完全是希腊语。我相对来说是飞镖的初学者。我只编码了大约5个月。

共有2个答案

谭泉
2023-03-14

我最近遇到了一个类似的情况,我建议您这样做(我正在使用cloud firestore,但我相信您已经编写了流,所以重要的部分是使用多个流):

您必须将此插件添加到pub spec.yaml中:https://pub.dev/packages/rxdart

以下是存储库(在您的帖子中,比如newPosts、oldPosts):

class PostRepository {

  static CollectionReference get collection => yourCollectionRef;
    
  static Stream<List<Post>> newPosts() {
    Query query = collection
        .where('Your condition like was viewed', isEqualTo: false)
        .orderBy('updateDate', descending: true)
        .limit(50);
    return query.snapshots().map<List<Post>>((querySnapshot) {
      final _newPosts = querySnapshot.documents.map((doc) {
        final post = Post.fromDoc(doc);
        return post;
      }).where((p) => p != null);

      return _newPosts
    });
  }

  static Stream<List<Post>> oldPosts() {
    Query query = collection
        .where('Your condition like was viewed', isEqualTo: true)
        .orderBy('updateDate', descending: true)
        .limit(50);
    return query.snapshots().map<List<Post>>((querySnapshot) {
      final _oldPosts = querySnapshot.documents.map((doc) {
        final post = Post.fromDoc(doc);
        return post;
      }).where((p) => p != null);

      return _oldPosts
    });
  }
}

然后,要获得多个流(以上两个流的组合),请在您的widget类中执行以下操作:

重要!您必须导入此-导入“包:rxdart/streams.dart”;

List<Post> newPosts;
List<Post> oldPosts;

Widget _pageContent() {
  return SingleChildScrollView(
    child: Column(
      children: [
        ListView.builder(
          shrinkWrap: true,
          physics: NeverScrollableScrollPhysics(),
          itemCount: newPosts.length,
          itemBuilder: (context, index) {
            return ListTile(
              title: Text(newPosts[index].title)
            );
          }
        ),
        ListView.builder(
          shrinkWrap: true,
          physics: NeverScrollableScrollPhysics(),
          itemCount: oldPosts.length,
          itemBuilder: (context, index) {
            return ListTile(
              title: Text(oldPosts[index].title)
            );
          }
        )
      ]
    )
  );
}

Widget _posts() {
  return StreamBuilder(
    stream: CombineLatestStream.list([
      PostRepository.getNewPosts(),
      PostRepository.getOldPosts()
    ]),
    builder: (context, snap) {
     if (snap.hasError) {

        debugPrint('${snap.error}');
        return ErrorContent(snap.error);

      } else if (!snap.hasData) {

        return Center(
          child: CircularProgressIndicator(),
        );

      }

      newPosts = snap.data[0];
      oldPosts = snap.data[1];

      return _pageContent();
    }
  );
}

我像是从头开始写代码的,所以可能会有一些小错误,但我希望你明白这一点,享受吧:)

诸葛彦
2023-03-14

您可以使用异步包中的StreamGroup:https://pub.dev/documentation/async/latest/async/StreamGroup-class.html将多个流中的事件分组-dart团队对其进行了充分的记录和维护。如果您没有RxDart经验,这是一个不错的选择。它没有rx的所有功能,但对于初学者来说,应该更容易理解这一点

 类似资料:
  • 操作步骤: ①在"图层管理"模块,选择图层,点击"更多"按钮。 ②点击"复制数据密钥"按钮。 ③弹出"复制数据密钥窗口",点击"复制"按钮。 ④进入想要合并的地图,点击地图右上工具条上的"数据密钥"按钮。 ⑤弹出"导入数据密钥窗口",粘贴刚才复制的密钥,点击"导入"按钮,数据在地图导入成功。 提示: ●复制图层数据参考复制拷贝图层 操作动图: [查看原图]

  • 从flink办公室引入会话窗口 https://ci.apache.org/projects/flink/flink-docs-stable/dev/stream/operators/windows.html#session-窗口。。。会话窗口操作符为每个到达的记录创建一个新窗口,如果窗口之间的距离比定义的间隙更近,则将窗口合并在一起。为了可合并,会话窗口操作符需要合并触发器和合并窗口函数,。。。

  • 问题内容: 我正在使用’Lucene.Net’库,并且有以下问题。 不是创建两个单独的QueryParser对象并使用它们来获得两个Hits对象,而是可以使用一个QueryParser对象在两个字段上进行搜索,这样我只有一个Hits对象,它可以为我提供每个文档的总体得分? 问题答案: 有3种方法可以做到这一点。 第一种方法是手动构造查询,这是QueryParser内部的工作。这是执行此操作最强大的

  • 问题内容: 供参考的是代码。我正在尝试制作一个记录到elasticsearch的hubot插件,然后使用hubot命令搜索那些日志。 https://gist.github.com/4050748 我正在尝试检索与两个查询匹配的记录。 我期待: 多达50条记录 具有给定用户的记录 最近一小时的记录 我有: 最多10条记录 具有给定用户的记录 从任何时候 我如何在过去一小时内获取带有某些用户名的所有

  • 问题内容: 如何合并两个保持BST属性的二叉搜索树? 如果我们决定从一棵树中取出每个元素并将其插入到另一个元素中,则此方法的复杂度将为,其中是我们已拆分的树的节点数(例如),是的结点数。另一棵树(例如)。此操作后,只有一个具有节点。 我的问题是:我们能做得比好吗? 问题答案: 纳夫的答案还有更多细节: 将BST展平为排序列表为O(N) 它只是整个树上的“有序”迭代。 两者都做O(n1 + n2)

  • 问题内容: 如何将其写成一行? 用id和class选择html标签的方法是什么? 问题答案: 您所要做的就是用逗号分隔它们,例如