2016-06-22 5 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

、活用トランザクションブロックも同様です。

+0

で答えを更新しました。これはうまくいきます、ありがとうございます。しかしもう1つの質問。私がプラスをクリックすると、アクションは実行され続け、何度も何度も何度も何度も繰り返します。あなたは修正を知っていますか? – user5812721

+0

実際、あなたのコードを完全に実装していないのは申し訳ありません。 observeSingleEventOfTypeとobserveEventTypeの違いは何ですか?どちらを使うべきですか? – user5812721

+2

observeSingleEventOfTypeはノードを一度読み込み、observeEventTypeはオブザーバーをそのノードに関連付けます。アプリケーションに一度通知した後、変更を継続的に監視(追加、変更、削除)し、変更が発生したときにアプリケーションに通知します。詳細は、Firebaseのガイド[データの取り込み](https://firebase.google.com/docs/database/ios/retrieve-data)を参照してください。一般に、データがほしいだけで、変更があるかどうかを知る必要がない場合は、このユースケースのようにobserveSingleEventOfTypeを使用します。チャットタイプのアプリケーションのような変更について知りたい場合は、observeEventTypeを使用してください – Jay

5

安全に現在のデータを取得してインクリメントするためにトランザクションを使用してみてください。 ここドキュメントの例を参照してください:これは、複数のユーザーによって頻繁に更新されようとしている場合ではない

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

(バージョン2.x Firebaseコードはしかし、あなたのアイデアを得る)なぜ がhttps://firebase.google.com/docs/database/ios/save-data#receive_a_completion_callback

+0

それはウェブ版なので、すばらしいバージョンが見つかりませんでした。 – user5812721

+1

申し訳ありません。 iOSドキュメントのリンク – Gil

関連する問題