2016-12-22 4 views
1

У меня есть эта функция пытается выполнить транзакцию, чтобы обновить Firebase значение:runTransactionBlock currentData является нулевым

if opponentPoints < self.points { 
         print("the host won") 
         refPoints.runTransactionBlock({ (currentData:FIRMutableData) -> FIRTransactionResult in 

          print("currentData", currentData.value!) 
          if var pointsToUpdate = currentData.value as? [String : Any] { 
           var pointsUp = pointsToUpdate["points"] as! Int 

           pointsUp += 3 
           pointsToUpdate["points"] = pointsUp 


           currentData.value = pointsToUpdate 

           return FIRTransactionResult.success(withValue: currentData) 
          } 

          return FIRTransactionResult.success(withValue: currentData) 
         }) 

и у меня есть эта структура:

users 
     uid 
     points 
     name 
     etc. 

Проблема заключается в том, что, когда я пытаюсь напечатать currentData , Я получаю null в качестве результата.

Что я делаю неправильно?

ответ

1

Когда вы начинаете транзакцию, транзакционные обработчики немедленно вызывается с наилучшим предположением клиента для текущего значения данных. Это чаще всего будет null.

Клиент Firebase затем отправляет лучшее предположение (null) и ваше значение на сервер. Сервер проверяет, понимает, что текущее значение неверно и отклоняет изменение. В этом отказе он затем сообщает клиенту текущее значение местоположения.

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

Короче говоря: ваш обработчик транзакций должен быть готов принять null в качестве текущего значения.

+0

Если это так, не следует ли currentData в конечном итоге возвращать правильное значение на сервере после сравнения значений? Я продолжаю получать null, хотя есть значение в указанном месте. –