J'essaie de gérer et de ne pas suivre dans mon application de médias sociaux en utilisant Firebase. J'ai un bouton intitulé "Suivre". Lorsqu'il est appuyé, il vérifie l'état de suivi actuel (récupéré dans viewDidLoad) et appelle les méthodes follow/unfollow en conséquence. user
représente le propriétaire de la page, et la personne que le currentUser
veut suivre/ne plus suivre. Comportement inattendu: Lorsque vous suivez un utilisateur une seconde fois, vous pouvez voir apparaître les noeuds enfants appropriés dans la base de données, puis disparaître. Ils ne devraient pas disparaître. J'ai rafraîchi la page pour m'assurer que les nœuds sont effectivement supprimés d'une manière ou d'une autre. Cela fonctionne correctement sur le premier essai après chaque lancement d'application.Les valeurs enfant Firebase mise à jour est la suppression des enfants
Voici mon viewDidLoad (chargé de récupérer currentUserIsFollowing). Je soupçonne que la question est ici:
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"
}
}
}
}
est ici l'action appelée lorsque le bouton Suivre/Arrêter de suivre est taraudée:
@IBAction func followUserButtonPressed(_ sender: Any) {
if !currentUserIsFollowing {
followUser()
return
}
if currentUserIsFollowing {
unfollowUser()
return
}
}
Voici la méthode 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))
}
}
}
Voici la méthode 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()
}
})
}
Voici une photo de mon arbre JSON:
je devais faire quelques changements pour obtenir ce travail, mais il est toujours pas comment j'envisageais les choses.Comme vous l'avez déjà écrit, vous ajoutez quelques points d'exclamation lors de l'interpolation de votre chaîne lors de la création de références. J'ai aussi dû changer if snapshot.value == nil vérifie si! Snapshot.exists() parce que la comparaison de nil à Any échouait. –
Une autre chose est que l'arborescence JSON ne ressemble pas comme prévu. Il va maintenant users/currentUser.uid/following/user.uid/(user.uid: true). J'espérais le structurer sans l'enfant dupliqué. c'est-à-dire users/currentUser.uid/following/(user.uid: true). Lorsque j'essayais cela, chaque nouvel utilisateur suivi écrasait le dernier. J'espère que cela à du sens. Comment puis-je obtenir le résultat souhaité? Ou devrais-je simplement laisser tel quel? –