Как избежать состояния гонки? - PullRequest
0 голосов
/ 23 февраля 2019

Я создаю случайное приложение для чата 1: 1 с Flutter и Firestore.Но у меня есть состояние гонки, когда я подключаю второго пользователя к чату.

Это код моего клиентского приложения для добавления второго пользователя в Firestore (первый пользователь уже добавлен в документ Firestore):

await chatRoomReference.setData({
  ‘secondUserUID': uid,
});

Когда второй пользователь коснется чата, я удаляю опцию, чтобы войти в негочат из всех клиентских интерфейсов.Но возможно, что если третий пользователь нажмет на чат одновременно (до того как пользователь получит обновление из потока), он также будет добавлен в базу данных.Чат не должен допустить этого.

Как избежать состояния гонки?

Спасибо!

ОБНОВЛЕНИЕ:

Каждый пользователь чата добавляется как новый документ в отдельную коллекцию пользователей для чата.

1 Ответ

0 голосов
/ 23 февраля 2019

Я думаю, ваша кнопка должна проверить количество людей в чате, а затем присоединиться к нему.

checkBeforeJoinTheChatRoom()
    .then((numbOfPeople){
        if(numbOfPeople < 2){ 
            joinChat();
        }
    }
)

Изменить: транзакция может работать в вашем случае:

final DocumentReference postRef = Firestore.instance.document('posts/123');
Firestore.instance.runTransaction((Transaction tx) async {
  DocumentSnapshot postSnapshot = await tx.get(postRef);
  if (postSnapshot.exists) {
    await tx.update(postRef, <String, dynamic>{'likesCount': postSnapshot.data['likesCount'] + 1});
  }
});

Подробнее о: cloud_firestore_transactions

...