【问题标题】:Does Tasks.whenAllSuccess guarantee the order in which I pass tasks to it?Tasks.whenAllSuccess 是否保证我将任务传递给它的顺序?
【发布时间】:2018-05-01 20:50:33
【问题描述】:

我在 Android 应用中使用 Cloud Firestore。

我创建了 2 个查询,一个 whereLessThan 和一个 whereGreaterThan 以有效地创建一个 != 查询。 我为每个单独的查询排序结果,但是当我单独运行它们时,我可能会首先返回一个或另一个,这取决于哪个更快。

当我将 2 个查询合并为 1,然后使用 Tasks.whenAllSuccess 方法得到 1 个 Task 并添加 1 个 OnSuccessListener 时,它会保持我传递任务的结果顺序吗?

public void loadNotes(View v) {
    Task task1 = notebookRef
            .whereLessThan("priority", 2)
            .orderBy("priority")
            .get();

    Task task2 = notebookRef
            .whereGreaterThan("priority", 2)
            .orderBy("priority")
            .get();

    Task finalTask = Tasks.whenAllSuccess(task1, task2).addOnSuccessListener(new OnSuccessListener<List<Object>>() {
        @Override
        public void onSuccess(List<Object> objects) {
            //will my results be ordered prioty 1 - 3 - 4 - 5....?
        }
    });
}

【问题讨论】:

    标签: android firebase google-cloud-firestore


    【解决方案1】:

    Tasks.whenAllSuccess(和其他 whenAll 方法)会将任务的结果按照传递给 whenAllSuccess 的顺序传递给 List 中的回调。如果您需要其他方式来获取结果,您可以使用原始 Task 对象维护一些数据结构,然后根据需要查询它们。

    【讨论】:

    • 谢谢。这是合并多个查询的适当方法吗?几乎没有关于它的文档。我已经找了好几个小时了。
    • 如果您想要一个单一的联系点来完成一系列任务,这是正确的方法。另请参阅这个多部分博客系列。 firebase.googleblog.com/2016/09/…
    • 感谢您的链接。我看到这是针对实时数据库的,但我想它也适用于 Firestore?我希望有更准确的文档,我偶然发现了这些方法。
    • 是的,但重要的部分是我以正确的顺序获得结果,而不仅仅是在它们全部完成时获得它们。但是我还没有阅读整个博客,也许答案就在那里。
    • 我可以再问两件事吗? OnCompleteListener 返回一个对象列表。我可以将这些对象转换为 QuerySnapshots 吗?而 continueWith 方法会等到 1 个任务完成,对吧?所以如果我想并行执行两个Task,最好不要使用它?
    猜你喜欢
    • 1970-01-01
    • 2016-11-18
    • 2011-05-24
    • 1970-01-01
    • 2011-06-07
    • 1970-01-01
    • 2017-05-07
    • 2021-07-19
    • 1970-01-01
    相关资源
    最近更新 更多