Я хочу взять userId текущего пользователя и добавить его как ребенка ко всем данным своих друзей - в Firebase с помощью Swift - PullRequest
0 голосов
/ 27 февраля 2019

В моей базе данных Firebase родительскими данными являются все userId s пользователей.У каждого из них есть child("friends"), который содержит список всех их друзей * userId s.

Я хочу получить userId друзей каждого currentUser друзей и добавить currentUser 's userId для каждого из узлов child("closeFriends") их друзей

Вот так выглядит моя структура данных:

users
    10XeC8j6OCcFTKj8Dm7lR7dVnkf1
        email: "Dummy19@gmail.com"
        fcmToken: "cBW9XhpYqio:APA91bF6K5YgRj0PgyDCoApNpIWGO4icwFg..."
        friends
            ekFjYJU8OWTbYnQXVzhcxVE0wBP2: true
        profileImageUrl: "https://firebasestorage.googleapis.com/v0/b/jar..."
        username: "Dummy19"
    ePt3MSOuk6ZYDfekewmPlG4LgcU2
        email: "Dummy20@gmail.com"
        fcmToken: "cBW9XhpYqio:APA91bF6K5YgRj0PgyDCoApNpIWGO4icwFg..."
        friends
            ekFjYJU8OWTbYnQXVzhcxVE0wBP2: true
            u43NtDYmqeTxafmLYjxxt60ngUo1: true
        profileImageUrl: "https://firebasestorage.googleapis.com/v0/b/jar..."
        username: "Dummy20"
    ekFjYJU8OWTbYnQXVzhcxVE0wBP2
        email: "Dummy18@gmail.com"
        fcmToken: "cF-b_Fd8Ufc:APA91bG9bir1o_jdJdfB35l9g9HlNNTNHPM..."
        friends
            10XeC8j6OCcFTKj8Dm7lR7dVnkf1: true
            ePt3MSOuk6ZYDfekewmPlG4LgcU2: true
        profileImageUrl: "https://firebasestorage.googleapis.com/v0/b/jar..."
        username: "Dummy18"
    u43NtDYmqeTxafmLYjxxt60ngUo1
        email: "Dummy21@gmail.com"
        fcmToken: "cBW9XhpYqio:APA91bF6K5YgRj0PgyDCoApNpIWGO4icwFg..."
        friends
            ePt3MSOuk6ZYDfekewmPlG4LgcU2: true
        profileImageUrl: "https://firebasestorage.googleapis.com/v0/b/jar..."
        username: "Dummy21"

И я хочу, чтобы closeFriends был узлом с userId s точно так же, как friends уже.

Это мои справочные переменные и функции:

let userReference = Database.database().reference().child("users")

var currentUserReference: DatabaseReference {
    let id = Auth.auth().currentUser!.uid
    return userReference.child("\(id)")
}

var currentUserFriendsReference: DatabaseReference {
    return currentUserReference.child("friends")
}

var currentUserCloseFriendsReference: DatabaseReference {
    return currentUserReference.child("closeFriends")
}

var currentUserId: String {
    let uid = Auth.auth().currentUser!.uid
    return uid
}

func getCurrentUser(_ completion: @escaping (User) -> Void) {
    currentUserReference.observeSingleEvent(of: DataEventType.value) { (snapshot) in
        let email: String = snapshot.childSnapshot(forPath: "email").value as! String
        let uid = snapshot.key

        let username = snapshot.childSnapshot(forPath: "username").value as! String

        let profileImageUrl = snapshot.childSnapshot(forPath: "profileImageUrl").value as! String

        completion(User(uid: uid, userUsername: username, userProfileImageUrl: profileImageUrl, userEmail: email))
    }
}

func getUser(_ userId: String, completion: @escaping (User) -> Void) {
    userReference.child(userId).observeSingleEvent(of: DataEventType.value, with: { (snapshot) in
        let email = snapshot.childSnapshot(forPath: "email").value as! String
        let uid = snapshot.key

        // Did the same thing here as in the above function
        let username = snapshot.childSnapshot(forPath: "username").value as! String

        let profileImageUrl = snapshot.childSnapshot(forPath: "profileImageUrl").value as! String

        completion(User(uid: uid, userUsername: username, userProfileImageUrl: profileImageUrl, userEmail: email))
    })
}

var closeFriendList = [User]()

Я пробовал этот цикл for, но ничего не сделал:

func addCurrentUserToCloseFriendsLists(_ userId: String){
    for friend in friendList{
        let id = friend.uid
        self.getUser(id) { (user) in
            self.closeFriendList.append(user)
            self.userReference.child(userId).child("closeFriends").child(self.currentUserId).setValue(true)
        }
    }

Для справки: friendList - это список друзей, созданный в другом файле (моя "FriendSystem").

Я уверен, что есть еще один способ получить всех друзей пользователя, а затем запуститьЦикл, чтобы добавить currentUser ко всем этим друзьям child("closeFriends"), я просто не смог разобраться.

Супер застрял на этом, надеюсь, вы можете помочь!Спасибо!

Ответы [ 2 ]

0 голосов
/ 02 марта 2019

Я хочу получить userIds друзей каждого currentUser и добавить userId currentUser к каждому дочернему ("closeFriends") узлу своих друзей

Давайте начнем с простой структуры пользователей, аналогичнойна ваш:

users
   uid_0
      name: "Larry"
      friends:
         uid_1: true
         uid_2: true
   uid_1
       name: "Moe"
   uid_2
       name: "Curly"

Идея состоит в том, чтобы просмотреть список друзей этого пользователя (текущего пользователя) и добавить этот идентификатор пользователя в список друзей других пользователей.В этом примере я просто создаю узел «друзья» для каждого пользователя, но вы можете сделать его «closeFriends» или любым другим именем, которое вы хотите.

Вот код для этого

let thisUserId = "uid_0"
func addThisUserIdToFriendsNode() {
    let usersRef = self.ref.child("users") //the general users node
    let thisUserRef = usersRef.child(self.thisUserId) //this users node
    let thisUserFriends = thisUserRef.child("friends") //this users list of friends

    //load in all of this users friends
    thisUserFriends.observeSingleEvent(of: .value, with: { snapshot in
        let allOfThisUsersFriends = snapshot.children.allObjects as! [DataSnapshot]
        for user in allOfThisUsersFriends {
            let friendRef = usersRef.child(user.key) //the friend ref
            let friendsFriendRef = friendRef.child("friends") //a friend friends child node
            let nodeToAdd = friendsFriendRef.child(self.thisUserId) //add this uid
            nodeToAdd.setValue(true)
        }
    })
}

и результат

users
   uid_0
      name: "Larry"
      friends:
         uid_1: true
         uid_2: true
   uid_1
       name: "Moe"
       friends
          uid_0: true
   uid_2
       name: "Curly"
       friends
          uid_0: true
0 голосов
/ 27 февраля 2019

Если я правильно понял ваш вопрос, я думаю, вы можете попробовать использовать Cloud DataStore вместо RealtimeDB.Описание различий между этими базами данных вы можете найти здесь .

Другой способ - использовать Firebase Functions.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...