前提・実現したいこと
お世話になっております。
SwiftとCloud Firestoreを使用してチャットアプリを作成しています。
Firebaseを使うのは初心者なので初歩的な質問になりますよろしくお願いします。
チャットアプリにはユーザーが名前を決めて作成できるルームがあり、いいねボタンを押すとそのルーム自体の「いいね数」が増えるような実装にしたいと思っております。
いいね数は押された分だけ増えるようにしたいです。できればもう一度ボタンを押すといいねを取り消せることも可能にしたいと思っております。
発生している問題・エラーメッセージ
document"room49"に入っているデータ["iineCount":5]の5の部分にグローバル変数であるiineCount2を代入しようと思っています。
ボタンを押すとaddSnapshotListener{}が呼ばれていいね数を取得。それに1プラスしてupdateData()でデータベースを更新するというやり方でやっています。
以下のソースコードではいいね数は加算されるのですが、1回目に押した時だけは加算されず0のままです。
またアプリを起動し直していいね!ボタンを押すとまた0からになってしまいます。
おそらくiineCount2の初期値である0に戻っていると思われます。
該当のソースコード
Swift
1import UIKit 2import FirebaseFirestore 3 4var iineCount2 = 0
Swift
1@IBAction func iineBAction(_ sender: Any) { 2 let db = Firestore.firestore() 3 let ref = db.collection("rooms").document("commentRoom").collection("commentRoom2").document("room47") 4 5 ref.addSnapshotListener{ (documentSnapshot, error) in 6 guard let documentSnapshot = documentSnapshot 7 else{ 8 print("Error fetching document: (error!)") 9 return 10 } 11 let source = documentSnapshot.metadata.hasPendingWrites ? "Local" : "Server" 12 print("(source) data : (String(describing: documentSnapshot.data()))") 13 14 let toridashi = documentSnapshot.data()?["iineCount"]!//ここでいいねカウントだけ取り出す 15 iineCount2 = toridashi! as! Int 16 iineCount2 += 1 17 } 18 19 ref.updateData(["iineCount":iineCount2]){ err in 20 21 if let err = err { 22 print("Error writing document: (err)") 23 } else { 24 print("Document successfully written!") 25 }} 26 27 } 28
試したこと
- iineCount2を定義する場所をIBAction内の一番上に変えた
毎回0に初期化されるのでいいね数は1にしかならない
.
.
- iineCount2を定義する場所をIBAction内のaddSnapshotListener{}とupdateData()の間に変えた
よくわからないがupdateData()方が先に実行され上と同じ結果
.
.
- iineCount2を定義する場所をaddSnapshot{}内に変えた
updateData()にiineCount2を置けない
.
.
- addSnapshot{}内にupdateData()を入れてみた
理由はわからないがものすごい勢いで加算されていく
補足情報(FW/ツールのバージョンなど)
Swift5
Firestore 1.4.5
そもそもこのようなやり方ではないやり方があるのでしたら教えていただけたら幸いです。
ご回答よろしくお願いいたします!
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/09/01 19:16