Как отменить транзакцию, если кнопка нажата снова, чтобы чтение и запись транзакций не увеличивались? - PullRequest
0 голосов
/ 24 октября 2019

Я использую приведенный ниже код для запуска транзакции в базе данных пожарного хранилища при нажатии или нажатии кнопки. Если условие уже выполнено, и та же кнопка снова нажата, как я могу отменить транзакцию, чтобы количество операций чтения и записи транзакции уменьшалось и больше не увеличивалось? Это как если бы нам понравился пост в Instagram, и если снова нажать на кнопку с сердечком, мы удалим то же самое с поста в Instagram.

 db.runTransaction({ (transaction, errorPointer) -> Any? in
    let sfDocument: DocumentSnapshot
    do {
        try sfDocument = transaction.getDocument(likesRef)

    } catch let fetchError as NSError {
        errorPointer?.pointee = fetchError
        return nil
    }

    guard let l1 = sfDocument.data()?["like"] as? Bool else {
        let error = NSError(
            domain: "AppErrorDomain",
            code: -1,
            userInfo: [
                NSLocalizedDescriptionKey: "Unable to retrieve population from snapshot \(sfDocument)"
            ]
        )
        errorPointer?.pointee = error
        return nil
    }

    // Note: this could be done without a transaction
    //       by updating the population using FieldValue.increment()
    //  let l11 = false
    guard l1 == false else {
        let error = NSError(
            domain: "AppErrorDomain",
            code: -2,
            userInfo: [NSLocalizedDescriptionKey: "Population \(l1) too big"]
        )
        errorPointer?.pointee = error
        return nil
    }

    transaction.updateData(["like": true], forDocument: likesRef)
    self.createMessageRoom()
    return l1
})

1 Ответ

1 голос
/ 24 октября 2019

В Cloud Firestore нет концепции «обратной транзакции» (как и в других базах данных, с которыми я работал). Если у вас есть два различных действия, которые противоположны друг другу, вам придется либо реализовать две транзакции, либо найти способ превратить «обращение» в параметр в одном блоке кода.

Последнее фактическикажется довольно распространенным для вашего сценария здесь, где вы используете одну транзакцию с этими шагами:

  1. Считайте текущее значение документа, содержащего лайки
  2. Если документ содержит аналог длятекущий пользователь удаляет его.
  3. Если документ не содержит аналога для текущего пользователя, добавьте его.

Если нам, например, модель «понравилась» as true and "has then unliked" as false`, вы можете сделать что-то вроде:

let newLikeValue true
guard l1 == true else {
  newLikeValue = false
}

transaction.updateData(["like": newLikeValue], forDocument: likesRef)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...