使用 FireStore 同步获取文档

Swa*_*nil 5 android firebase parse-server google-cloud-firestore

我一直在parse-server用作我的后端,现在将我所有的东西迁移到FireStore(特别是用于存储额外的用户数据)。现在,通过 parse 我可以直接使用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 {
                    ......
                }
            });
Run Code Online (Sandbox Code Playgroud)

有没有一种方法可以让我们DocumentReference 假设数据是本地缓存的,从而直接同步获取数据?就像是:

mFirestore.collection(USER_COLLECTION).document(mAuthApi.getCurrentUserId()).getString(...)
Run Code Online (Sandbox Code Playgroud)

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

Ale*_*amo 1

有没有一种方法可以让我们直接从 DocumentReference 同步获取数据(假设数据是本地缓存的)?

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

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

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

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

  • 有时,您确实需要同步查询,尤其是当您“已经”在后台处理数据时。您在此处描述的模式在与 UI 元素交互时非常有用,但在需要按顺序加载时却很糟糕。 (14认同)
  • 不,您不必总是这样做。以后台同步进程为例,它已经在自己的线程中,并且可以在不中断用户体验的情况下花费所需的时间(本质上已经与异步进程执行相同的操作)。在这种情况下,最重要的是一切都按顺序发生。例如,您可能需要知道在更新或删除之前发生的所有创建。如果每个调用都是异步的,您最终会陷入竞争状态。 (4认同)
  • @BrillPappin /sf/answers/3291472971/ 这是您正在寻找的答案,使用 DocumentSnapshot doc = Tasks.await(task); (3认同)