Как я могу использовать Задачи с Firestore onSnapshotListener для цепочки живых обновлений? - PullRequest
0 голосов
/ 17 мая 2018

Я могу связывать команды Firestore get () вместе, используя Задачи, но я хотел бы сделать то же самое, используя onSnapshotListener Firestore, чтобы я мог связывать обновления в реальном времени вместе.

Вот пример кода, который я использую для объединения нескольких рекомендаций:

Query usersQuery = mDbase.collection("admins").document(adminID).collection("users");
Query booksQuery = mDbase.collection("books").whereEqualTo("groupID", groupID);
DocumentReference adminDoc = mDbase.collection("admins").document(adminID);

final Task<QuerySnapshot> getUsers = usersQuery.get();
final Task<QuerySnapshot> getBooks = booksQuery.get();
final Task<DocumentSnapshot> getAdmin = adminDoc.get();

Tasks.whenAllSuccess(getUsers, getBooks, getAdmin)
        .addOnCompleteListener(new OnCompleteListener<List<Object>>() {
            @Override
            public void onComplete(@NonNull Task<List<Object>> task) {
                List<User> users = getUsers.getResult().toObjects(User.class);
                List<Book> books = getBooks.getResult().toObjects(Book.class);
                Admin admin = getAdmin.getResult().toObject(Admin.class);

                // ...
            }
        }); 

Моя цель заключается в следующем: «(I) хочу рассматривать три отдельных прослушивателя моментальных снимков как один« поток », и всякий раз, когда событие запускается в любом из них, (I) хочу получить обновление с последним значением для все трое." Цитата и пример кода предоставлены Сэмом Стерном на форуме Google Firestore.

Для моих целей мне кажется, что мне понадобятся обновления в реальном времени.

Вот мой вложенный код снимка:

firebaseGetUsers.readDataRTUpdate(new FirebaseGetUsers.FirestoreCallback() {
        @Override
        public void onCallback(final List<User> users) {
            firebaseGetBooks.readDataRTUpdate(new FirebaseGetBooks.FirestoreCallback() {
                @Override
                public void onCallback(final List<Book> books) {
                    firebaseGetThisAdmin.readDataRTUpdate(new FirebaseGetThisAdmin.FirestoreCallback() {
                        @Override
                        public void onCallback(Admin admin) {
                            //processing all code here.
                            //books are empty!!
                            System.out.println("books: " + books.toString());
                            }
                        }
                    });
                }
            });
        }
    }); 

Спасибо.

1 Ответ

0 голосов
/ 18 мая 2018

То, что вы спрашиваете, на самом деле неосуществимо для слушателей снимков. Задача представляет собой единицу работы, которая в конечном итоге завершается с конечным результатом или некоторой ошибкой. Они не подходят для текущей работы или потоковой передачи данных, поскольку никогда не бывает единого конечного результата. Вместо этого вы регистрируете прослушиватель, который вызывается для каждого обновления, которое останавливается только в тот момент, когда вы решите его остановить. Поэтому, что бы вы ни пытались сделать, вам придется писать код, который управляет слушателями, а не задачами.

...