【问题标题】:Getting a document synchronously using FireStore使用 FireStore 同步获取文档
【发布时间】:2018-11-16 02:46:02
【问题描述】:

我一直使用parse-server 作为我的后端,现在将我所有的东西迁移到FireStore(专门用于存储额外的用户数据)。现在,通过解析,我可以直接使用ParseUser.getCurrentUser().getString(...) 获取用户数据。如果我使用FireStore,我创建了一个users 集合,我可以为每个用户存储一个document,它还支持本地存储和离线支持。但我面临的问题是我总是需要使用异步/回调方法从document 获取数据。这是android中的一个例子:

final DocumentReference docRef = mFirestore
                    .collection(USER_COLLECTION).document(mAuthApi.getCurrentUserId());
            docRef.get(Source.CACHE).addOnCompleteListener(task -> {
                if(task.isSuccessful()) {
                    ......
                } else {
                    ......
                }
            });

有没有一种方法可以直接从DocumentReference同步获取数据假设它是本地缓存的?比如:

mFirestore.collection(USER_COLLECTION).document(mAuthApi.getCurrentUserId()).getString(...)

这对我来说很容易,因为我需要在整个代码库中将 ParseUser.getCurrentUser().getString(...) 替换为等效的 FireStore 调用。

【问题讨论】:

  • 我认为这里的基本答案是:不。
  • 如果我在 Firestore 中的理解正确,您可以配置离线持久化,如果您启用了离线持久化,当本地缓存数据发生变化时,您的监听器将收到监听事件

标签: android firebase google-cloud-firestore parse-server


【解决方案1】:

假设它是本地缓存的,我们是否可以直接从 DocumentReference 同步获取数据?

不,在响应式应用程序方面没有。当您连接到服务器时,您无法强制从缓存中检索数据,因为您无法在未连接到服务器时停止从缓存中检索数据。

但不仅 Firebase 实时数据库或 Cloud Firestore 异步加载数据,几乎所有现代其他 Web API 都这样做,因为获取数据可能需要一些时间。因此,如果您强制同步获取数据,则会导致用户的应用程序对话框无响应。

大多数开发人员的最初反应是尝试“修复”这种异步行为,我个人建议不要这样做。 Web 是异步的,一旦您接受了这一点,您将学习如何使用现代 Web API 提高工作效率。

Doug Stevenson 写了一个非常有趣的post,它将帮助您更好地理解这个概念。

【讨论】:

  • 有时,您确实需要同步查询,尤其是当您已经在后台处理数据时。您在此处描述的模式在您与 UI 元素交互时非常棒,但在您需要按顺序加载时就很糟糕。
  • @BrillPappin 即使您需要按顺序加载数据,您仍然需要异步获取,这是因为获取数据需要时间。
  • 不,您不必总是这样做。以后台同步进程为例,它已经在它自己的线程中,它可以在不中断用户体验的情况下花费尽可能长的时间(基本上已经在做与异步进程相同的事情)。这种情况至关重要的是,一切都按顺序进行。例如,您可能需要知道您的所有创建都发生在更新或删除之前。如果每个调用都是异步的,那么您最终会陷入竞争状态。
  • @BrillPappin stackoverflow.com/a/47021042/3994127 这是您正在寻找的答案,使用 DocumentSnapshot doc = Tasks.await(task);
【解决方案2】:

看起来您可以使用基于 Future 的 API,例如以下行来按顺序执行行,就好像它们是同步事件一样。

final documents = await Firestore.instance.document("/user/$_userId").collection('reviews').getDocuments();

【讨论】:

  • @FindOutIslam 现在是 Kotlin 和 Coroutines,纯 Android。
猜你喜欢
  • 1970-01-01
  • 2020-08-01
  • 2020-09-30
  • 2022-01-20
  • 2018-09-03
  • 2019-09-17
  • 2020-12-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多