2016-06-22 2 views
3

У меня возникли проблемы с увеличением количества данных в Firebase.Самый простой способ увеличить точку данных в Firebase?

Firebase { 
    clickedCounter: 0 
} 

Это мой код:

@IBAction func plus(sender: UIButton) { 
     FIRDatabase.database().reference().child("clickedCounter").observeEventType(.Value) { (snap: FIRDataSnapshot) in 
      let value = FIRDatabase.database().reference().child("clickedCounter") as? NSNumber 
      let increment = ((value?.intValue)! + ((1 as? NSNumber)?.intValue)!) as? NSNumber 
      FIRDatabase.database().reference().child("clickedCounter").setValue() 
      self.clickLabel.text = snap.value?.description as String! 
     } 
    } 

Я также попытался:

@IBAction func plus(sender: UIButton) { 
     FIRDatabase.database().reference().child("clickedCounter").observeEventType(.Value) { (snap: FIRDataSnapshot) in 
      FIRDatabase.database().reference().child("clickedCounter").setValue((snap.value?.description)! + 1) 
      self.clickedLabel.text = snap.value?.description as! String! 
     } 
    } 

Для моих первых моих предупреждений являются:

Cast from Int32 to NSNumber always fails

Conditional cast from NSNumber to NSNumber always succeeds

Cast from FIRDatabaseReference to NSNumber always fails

После того как я бежал, я получил ошибку на let increment....: Thread 1: EXC_BAD_INSTRUCTION

Для моего второго ошибка:

Binary operator + cannot be applied to operands of the type String and Int

  1. Я запутался как мой snap.value?.description является строкой, когда я думал, что я определил ее в Firebase как Int.

  2. Почему я получаю предупреждение, когда что-то всегда удается?

  3. Есть ли лучший способ сделать это?

Спасибо!

ответ

6

Почему нет (v2.x Firebase код, но вы получите идею)

counterRef.observeSingleEventOfType(.Value, withBlock: { snapshot in 
    let valString = snapshot.value 
    var value = valString.intValue 
    value = value + 1 
    counterRef.setValue("\(value)")   
}) 

Если это будет часто обновляться несколькими пользователями, использовать транзакционный блок.

+0

Это работает, спасибо. Еще один вопрос. Когда я нажал на плюс, действие продолжало работать, делая число +1 снова и снова. Вы знаете, что исправить? – user5812721

+0

На самом деле, извините, я полностью не реализовал ваш код. В чем разница между функцией наблюденияSingleEventOfType и observEventType? Когда я должен использовать? – user5812721

+2

observSingleEventOfType считывает узел один раз, тогда как observEventType присоединяет наблюдателя к этому узлу. Он уведомляет приложение один раз, а затем постоянно отслеживает изменения (добавляет, изменяет, удаляет) и уведомляет приложение об этих изменениях, когда они происходят. Подробнее см. В руководстве Firebase [Получить данные] (https://firebase.google.com/docs/database/ios/retrieve-data). Как правило, если вы просто хотите получить кусочек данных и не нуждаетесь в том, чтобы узнать, изменилось ли оно, используйте функцию observSingleEventOfType, как в этом случае использования. Если вы хотите узнать об изменениях, например, в приложении типа чата, используйте функцию registerEventType – Jay

5

Попробуйте использовать транзакции, чтобы безопасно получать текущие данные и увеличивать их. Смотрите пример в документации здесь: https://firebase.google.com/docs/database/ios/save-data#receive_a_completion_callback

+0

Это веб-версия, я не мог найти быструю версию. – user5812721

+1

Извините. Обновлен ответ с ссылкой на документы iOS – Gil

Смежные вопросы