【问题标题】:Firebase: avoiding READs when updating dataFirebase:更新数据时避免读取
【发布时间】:2021-03-19 15:29:21
【问题描述】:

我目前正在设置我的第一个 Firebase 商店,并想知道如何最好地避免不必要的读/写成本(以及如何创建嵌套结构......)。 this answer 很有帮助。

但是,如果我听到文档的更改(由其他人引起),我假设我自己也会再次得到任何更改作为回报。因此,当使用 bloc 的 todo 示例的逻辑时,我更新了一个文档。我的侦听器识别出这一点并触发一个事件以从存储库中重新读取数据。

@override
  Stream<TodosState> mapEventToState(TodosEvent event) async* {
    if (event is LoadTodos) {
      yield* _mapLoadTodosToState();
    } else if (event is TodosUpdated) {
      yield* _mapTodosUpdateToState(event);
    } else if (event is UpdateTodo) {
      yield* _mapUpdateTodoToState(event);
    }

  Stream<TodosState> _mapLoadTodosToState() async* {
    _todosSubscription?.cancel();
    _todosSubscription = _todosRepository.todos().listen(
          (todos) => add(TodosUpdated(todos)),
        );
  }

  Stream<TodosState> _mapTodosUpdateToState(TodosUpdated event) async* {
    yield TodosLoaded(event.todos);
  }

  Stream<TodosState> _mapUpdateTodoToState(UpdateTodo event) async* {
    _todosRepository.updateTodo(event.updatedTodo);
  }

由于我假设我的应用程序中的同一用户可能对文档进行多次近期更改,因此将源选项设置为离线缓存 1 分钟,每次写入访问是一个正确的选项还是有更好的选项?

如果没有,我能否以某种方式确保在用户离开应用程序时发送数据(例如,当预先启动另一个应用程序时)?

有没有关于如何使用 Firestone 和 Flutter 的概述?不幸的是,Google's documentation 中的编码示例适用于除 Dart/Flutter 之外的任何语言。例如,我将如何使用 Flutter 设置源选项(尚未搜索)?

【问题讨论】:

  • 您不应该以这种方式优化读取。这不值得 - 如果您担心这个,我假设您正在从事一个业余项目,但是,即使您正在将数据写入这些位置,您仍然应该在需要它们的地方使用实时侦听器。
  • 是的,它目前是一种爱好 POC,但可能会变成一个小型商业应用程序。但当然我可以按照你的建议开始,如果它应该改变这种逻辑,那么。

标签: firebase flutter google-cloud-firestore


【解决方案1】:

你真的不能同时拥有这两种方式,你要么需要放弃实时,要么假设这可能会产生更多的成本,正如@creativecreator 所提到的,或者你可能不应该仍然使用监听器来处理实时更新。

您共享的已接受答案中的 cmets 是通过使用缓存和特别分页更好地利用侦听器的有效点,因为您很可能不需要一直将所有文档都保存在内存中。

此外,对于小型项目,听众似乎并不昂贵,而且您的 Firestore 每天有 50.000 次免费阅读,其中包括来自听众的阅读。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多