我試圖在使用Firebase的社交媒體應用中處理以下並取消追蹤。我有一個名爲「Follow」的酒吧按鈕項目。點擊時,它會檢查當前的跟蹤狀態(在viewDidLoad中檢索),並相應地調用跟隨/取消關注方法。 user
代表頁面的所有者,以及currentUser
想要關注/取消關注的人員。Firebase更新孩子的價值觀正在消除子女
意外的行爲:當第二次跟蹤用戶時,可以看到數據庫中正確的子節點出現,然後消失。他們不應該消失。我刷新了頁面以確保節點實際上被刪除了。它在每次應用發佈後的第一次嘗試中正常運行。
這是我的viewDidLoad(負責檢索currentUserIsFollowing)。我懷疑問題就出在這裏:
override func viewDidLoad() {
super.viewDidLoad()
let userDogRef = Database.database().reference().child("users").child(user.uid!).child("dogs")
let followingRef = Database.database().reference().child("users").child((Auth.auth().currentUser?.uid)!).child("following")
followingRef.observeSingleEvent(of: .childAdded) { (snapshot) in
if snapshot.value == nil {
print("no following found")
return
}
let value = snapshot.value as? NSDictionary
let followingUserUID = String(describing: value!["uid"]!)
if self.user.uid == followingUserUID {
self.currentUserIsFollowing = true
DispatchQueue.main.async {
self.followBarButtonItem.title = "Unfollow"
}
}
}
}
這裏是當跟蹤/停止追隨按鈕被竊聽稱爲動作:
@IBAction func followUserButtonPressed(_ sender: Any) {
if !currentUserIsFollowing {
followUser()
return
}
if currentUserIsFollowing {
unfollowUser()
return
}
}
這裏是followUser()
方法:
fileprivate func followUser() {
let followingRef = Database.database().reference().child("users").child((Auth.auth().currentUser?.uid)!).child("following")
let followersRef = Database.database().reference().child("users").child(user.uid!).child("followers")
followingRef.childByAutoId().updateChildValues(["uid": user.uid as Any]) { (error, ref) in
if error != nil {
print(String(describing: error?.localizedDescription))
}
}
followersRef.childByAutoId().updateChildValues(["uid": Auth.auth().currentUser?.uid as Any]) { (error, ref) in
if error != nil {
print(String(describing: error?.localizedDescription))
}
}
}
這裏unfollowUser()
方法:
fileprivate func unfollowUser() {
let followingRef = Database.database().reference().child("users").child((Auth.auth().currentUser?.uid)!).child("following")
let followersRef = Database.database().reference().child("users").child(user.uid!).child("followers")
followingRef.observeSingleEvent(of: .childAdded, with: { (snapshot) in
if snapshot.value == nil {
print("no following found")
}
let value = snapshot.value as? NSDictionary
let followingUserUID = String(describing: value!["uid"]!)
if self.user.uid == followingUserUID {
snapshot.ref.removeValue()
}
})
followersRef.observeSingleEvent(of: .childAdded, with: { (snapshot) in
if snapshot.value == nil {
print("no followers found")
}
let value = snapshot.value as? NSDictionary
let followerUserUID = String(describing: value!["uid"]!)
if Auth.auth().currentUser?.uid == followerUserUID {
snapshot.ref.removeValue()
}
})
}
這裏是我的JSON樹的照片:
我不得不做出一些改變來得到這個工作,但它仍然不是我預想的事情。正如您目前編寫的那樣,創建引用時,您在字符串插值期間添加了一些感嘆號。我還必須將if snapshot.value == nil檢查更改爲if!snapshot.exists(),因爲nil與Any的比較失敗。 –
另一件事是JSON樹看起來不像預期的那樣。它現在變成users/currentUser.uid/following/user.uid /(user.uid:true)。我希望能在沒有重複孩子的情況下構建它。即users/currentUser.uid/following /(user.uid:true)。當我嘗試這個時,每個新用戶都會覆蓋最後一個。我希望這是有道理的。我怎樣才能得到想要的結果?或者我應該保持原樣? –