発生している問題、知りたいこと
Firebaseのドキュメント
https://firebase.google.com/docs/database/ios/read-and-write?hl=ja#detach_listeners
において、
引用テキストオブザーバーが適切に削除されないと、オブザーバーによってデータがローカルメモリに同期され続けます。
加えて、
さらに、データ(子も含む)が変更されると、そのたびに再トリガーされます
とありますが、その、オブザーバーを適切に削除するとはどういうことかが知りたいです!!
自分の状況
画面①(CategoryShow画面)CategoryIDを元に紐づいたSubliminal群を表示
画面②(SubliminalShow画面)SubliminalIDを元に、Subliminalの情報を表示(この画面で、Subliminalの削除を行う)
②の画面で削除処理を実行(値の変化が発生)すると、別画面①のイベントが発生してしまう。
###前提・実現したいこと
ということは、②の画面で、「Firebaseの指定したデータベース参照でデータの変更(削除)」されても、
別の画面のイベント(取得)のトリガーを発生させなくすればいいのでは、と考えました。
その方法が知りたいです!!
また、データ削除処理を行った時に、データ取得のイベントがトリガーされないようにしたいです!!
問題のコード
画面①における、データ取得のコード
swift
1 //MARK:catetorys/subliminlas/autoIDから、subliminals/autoID/subliminalTitleImageを取得する 2 func getSubliminalTitleImage(){ 3 //MARK:DB迄のreference 4 let ref = Database.database().reference() 5 //MARK:categorys/autoID/subliminals迄のreference 6 let categorySubliminalsRef = ref.child("categorys").child(categoryArray[0].categoryID).child("subliminals") 7 //MARK:subliminals迄のreference 8 let subliminalsRef = ref.child("subliminals") 9 10 print("(A)(func getSubliminalTitleImage() debag2=========================") 11 //MARK:1度目は、snapShotが取得されるまでは、素通りされる 12 //MARK:categorys/autoID/に紐付くsubliminalsの、autoID:true群を取得 13 categorySubliminalsRef.observe(.value) { [self] (snapShot) in 14 print("1.snapShot=========================") 15 print(snapShot) 16 if let snapShot = snapShot.children.allObjects as? [DataSnapshot]{ 17 print("2.空判定後のsnapShot=========================") 18 print(snapShot) 19 for snap in snapShot{ 20 print("(for)3.snap=========================") 21 print(snap) 22 let subliminalAutoID = snap.key 23 print("(for)4.subliminalAutoID=========================") 24 print(subliminalAutoID) 25 //MARK:配列に格納 26 self.subliminalAutoIdArray!.append(subliminalAutoID) 27 print("(for)5.subliminalAutoIdArrayの数=========================") 28 print(self.subliminalAutoIdArray?.count as Any) 29 }//for 30 31 32 for autoID in subliminalAutoIdArray!{ 33 print("debag3") 34 print(subliminalAutoIdArray) 35 36 //MARK:subliminals/subliminalTitleImageを、連番:Stringの形で取得(値は1個だけ) 37 let subliminalTitleImageRef = subliminalsRef.child("(autoID)/subliminalTitleImage") 38 subliminalTitleImageRef.observe(.value) { (snapShot) in 39 print("(A)6.snapShot(subliminalTitleImage)(for)=========================") 40 print(snapShot) 41 //MARK:連番:Stringの内、valueだけを取得 42 let snap = snapShot.value as AnyObject 43 subliminalTitleImageArray?.append(snap) 44 print("(A)7.snapShot(subliminalTitleImage)(for)=========================") 45 print(subliminalTitleImageArray?.count) 46 //MARK:値が格納されて、collectionViewをreloadData()を発動させる 47 subliminalsTableViewCell.collectionView.reloadData() 48 }//observe 49 }//for 50 }//if 51 }//observe 52 }//func 53}//class
画面②における、データ削除のコード
swift
1 //MARK:Firebase/subliminalsから、該当するsubliminalを削除する 2 //MARK:それと共にFirebase/Categorys/autoID/subliminals/からリレーションを削除する処理 3 func deleteSubliminal(){ 4 print("(B)5.deleteSubliminal=============================") 5 print("(B)(self.subliminalArray)") 6 7 8 9 //MARK:categorys/autoID/subliminalsのリレーションを削除========= 10 //MARK:リファレンス作成 11 let categorysRef = Database.database().reference().child("categorys") 12 //MARK:categoryIDを一つづつ取り出して(複数のcategoryが存在する前提) 13 for categoryAutoID in subliminaRelationCategorysKeyArray{ 14 //MARK:Categorys/autoID/subliminals配下の情報を削除 15 //MARK:Categoeys/autoID/subliminals/[string:Bool]型だけど、subliminals/stringだけで削除出来る 16 let categorysSubliminalRef = categorysRef.child("(categoryAutoID)").child("subliminals").child(subliminalID) 17 categorysSubliminalRef.removeValue() 18 } 19 20 21 //MARK:subliminalの削除===================================== 22 //MARK:リファレンス作成 23 let subliminalRef = Database.database().reference().child("subliminals").child(subliminalID) 24 //MARK:subliminalを削除 25 subliminalRef.removeValue() 26 27 28 29 30 31 32 33 34 self.subliminalArray.removeAll() 35 print("(B)5.deleteSubliminal(subliminalArray.removeAll()後)=============================") 36 print("(B)(subliminalArray)") 37 //MARK:該当のsubliminalとcategorysのリファレンスを削除した後、CategoryShow画面に戻りたい 38 self.navigationController?.popViewController(animated: true) 39 }
最後に
まだ、Firebaseが使いこなせておらず、分からないことだらけでして、ご教授いただけたらと思います!!
よろしくお願いします!!
なお、この質問は、前回の質問「Thread 1: Fatal error: Unexpectedly found nil while unwrapping an Optional value」のエラーの原因」(https://teratail.com/questions/326068)の続きにもなっていますので、参考にしていただけたらありがたいです!!
回答1件
あなたの回答
tips
プレビュー