ios - deleting a child from firebase when flagging a post -
i have been trying delete post firebase when post gets more 2 flags. have tried lot of ways , cannot figure out. have images attached appreciated! `
// 4 if poster.uid != user.current.uid { let flagaction = uialertaction(title: "report inappropriate", style: .default) { _ in postservice.flag(post) /// addedflag let flaggedpostref = database.database().reference().child("flaggedposts").child(postkey!) // 3 var flaggeddict = ["text": post.textdata, "poster_uid": post.poster.uid, "reporter_uid": user.current.uid] // 4 flaggedpostref.updatechildvalues(flaggeddict) // 5 let flagcountref = flaggedpostref.child("flag_count") flagcountref.runtransactionblock({ (mutabledata) -> transactionresult in let currentcount = mutabledata.value as? int ?? 0 mutabledata.value = currentcount if mutabledata.value as! int >= 1 { let uid = firauth.auth()!.poster.uid!.uid // remove post db ref.child("posts").child(postkey).removevalue { error in if error != nil { print("error \(error)") } } postkey?.removevolue() let timelinepostdict = ["poster_uid" : poster.uid] var updateddata: [string : any] = ["timeline/\(poster.uid)/\(postkey)" : timelinepostdict] let posttobedeleted = database.database().reference().child("posts") updateddata["timeline/\(poster.uid)/\(postkey)"] = timelinepostdict updateddata["posts/\(poster.uid)/\(postkey)"] = postkey print("delete case: mutabledata.value = \(mutabledata.value)") } else { print("case not met. either not equal 2 or not able cast integer type. value of casted in \(mutabledata.value as? int)") } mutabledata.value = currentcount + 1 return transactionresult.success(withvalue: mutabledata) })
the .runtransactionblock({..
gets triggered multiple times before value appended/updated @ particular node. need observer :-
database.database().reference().child("flaggedposts").observe(.childchanged, with: {(snapshot) in // every time child dictionary in flaggedposts node // change receive dictionary in block // change in of values in postkey // check flagcount value , perform action requisite... print(snapshot.value ?? "no value retrieved") if let snapdict = snapshot.value as? nsdictionary{ let count = snapdict["count"] as! int let postid = snapdict["postkey"] as! string let posteruid = snapdict["poster_uid"] as! string if count > 1{ print(postid) // pushed block if count value // greater 1 i.e 2 // delete postid in database database.database().reference().child("posts/\(posteruid)/\(postid)").removevalue(completionblock: {(err, ref) in // handle error recieve while deleting // flagged post }) } } }, withcancel: {(error) in // handle error recieved while making // call firebase })
given method uses .observe(.childchanged..
, asynchronous active call observer not removed network link. database triggered every time child changed/updated...
Comments
Post a Comment