链接Firebase Firestore查询和文档快照任务的性能

时间:2018-03-20 19:35:30

标签: android firebase google-cloud-firestore

我正在创建一个使用Firebase Firestore存储一些数据的Android应用。由于Firestore尚不支持collection group queries,因此为了构建我需要的一些结果集,我必须执行Query后跟多个DocumentReference.get()调用以实现所需的结果结果

我的实施如下:

PlaylistFacade.java

public static Task<QuerySnapshot> GetPlaylistSubscriptionsByOwner(FirebaseFirestore db, @NonNull String ownerUserId)
{
    Query playlistRef = db.collection("playlistSubscriptions")
            .whereEqualTo("ownerId", ownerUserId);

    return playlistRef.get();
}

public static Task<DocumentSnapshot> GetPlaylist(FirebaseFirestore db, @NonNull String playlistId)
{
    return db.collection("playlists").document(playlistId).get();
}

PlaylistActivity.java

PlaylistFacade.GetPlaylistSubscriptionsByOwner(mFirestore, this.GetCurrentUser().getUid())
            .continueWithTask(new Continuation<QuerySnapshot, Task<List<Task<?>>>>() {
                @Override
                public Task<List<Task<?>>> then(@NonNull Task<QuerySnapshot> task) throws Exception {
                    List<Task<DocumentSnapshot>> tasks = new ArrayList<>();
                    for(DocumentSnapshot doc:task.getResult().getDocuments())
                    {
                        PlaylistSubscription ps = doc.toObject(PlaylistSubscription.class);
                        ps.setId(doc.getId());
                        tasks.add(PlaylistFacade.GetPlaylist(mFirestore, ps.getPlaylistId()));
                    }
                    return Tasks.whenAllComplete(tasks);

                }
            })
            .addOnCompleteListener(this, new OnCompleteListener<List<Task<?>>>() {
                @Override
                public void onComplete(@NonNull Task<List<Task<?>>> task) {
                    if(task.isSuccessful()){
                        List<Task<?>> tasks = task.getResult();
                        List<Playlist> playLists = new ArrayList<>();
                        int errorCount = 0;
                        for(Task<?> docTask : tasks)
                        {
                            if(docTask.isSuccessful())
                            {
                                DocumentSnapshot ds = (DocumentSnapshot)docTask.getResult();
                                Playlist pl = ds.toObject(Playlist.class);
                                pl.setId(ds.getId());
                                playLists.add(pl);
                            }
                            else
                            {
                                Crashlytics.logException(docTask.getException());
                                errorCount++;
                            }
                        }

                        if(errorCount > 0)
                            Toast.makeText(PlaylistActivity.this, "Encountered " + errorCount + " errors.", Toast.LENGTH_LONG).show();
                        else
                            Toast.makeText(PlaylistActivity.this, "Success", Toast.LENGTH_LONG).show();
                    }
                    else
                    {
                        Crashlytics.logException(task.getException());
                        Toast.makeText(PlaylistActivity.this, task.getException().getMessage(), Toast.LENGTH_LONG).show();
                    }
                }
            });

上述工作正常,但我很好奇是否有更好的方法可以做到。

我的问题如下:

  1. 使用List<>链接Task对象是理想的方法吗?我是否通过这种方法放弃任何潜在的表现?
  2. 使用任务链是否仍然允许我利用Firebase的pipeline requests能力?
  3. 我使用Tasks.whenAllComplete()是否允许我有条件地接受某些或所有结果的失败,或者Firebase的流水线操作会导致错误传播到请求之间,以至于我应该只使用Tasks.whenAllSuccess()并避免需要检查每个请求的成功?
  4. 我的实现的响应时间在小结果集上似乎很好。如果我在Cloud Function中构建结果集然后将其返回到我的应用程序之前,我的结果集会增长,我的性能会提高吗?
  5. deleteCollection(...)函数的DocSnippets.java示例中所示,我应该使用Executor实现Firestore操作的复杂程度吗?
  6. 使用Transaction捆绑请求会不会给我带来任何性能提升?在the documentation
  7. 中不讨论在事务中执行读取的性能影响
  8. 任何有关何时收集组查询的消息都将在Firestore中提供?及时为Google IO,也许?
  9. 感谢您的时间。

    其他有用资源可以帮助那些最终遇到类似问题的人:

    Doug Stevenson's Firebase Blog Post on Task Wiring

0 个答案:

没有答案