用Swift查询朋友的朋友

时间:2017-12-05 03:42:28

标签: arrays swift firebase firebase-realtime-database

我正在尝试使用Firebase提取我的朋友和朋友的朋友列表。现在,我正在拉我的朋友列表,然后循环浏览他们的朋友以获取他们的用户ID。我想将它附加到具有输出[“friendID1”,“friendID2”,“friendID3”,“friendID4”,“friendID5”]的单个数组中。到目前为止我的代码:

 Database.database().reference().child("friends").child(myID).observeSingleEvent(of: .value, with: { (snapshot : DataSnapshot) in

       for child in snapshot.children.allObjects as! [DataSnapshot] {

            let value = child.value as? NSDictionary

            let userId = value?["userId"] as? String ?? ""

         Database.database().reference().child("friends").child(friendID1).observeSingleEvent(of: .value, with: { (snapshot : DataSnapshot) in


                for child1 in snapshot.children.allObjects as! [DataSnapshot] {


                    let value1 = child1.value as? NSDictionary

                    let userId1 = value1?["userId"] as? String ?? ""
                    self.friendArray.append(userId1)                   
                }
            })
        }
  })

Firebase结构

{
    "friends" : {
        “currentUserId” : {
            “friendId1” : {
                “Confirmed” : "yes"
            },
            “friendId3” : {
                “Confirmed” : “Yes”,
            }
            “friendId5” : {
                “Confirmed” : “Yes”,
            }
        },
        “friendId1” : {
            “CurrentUserId” : {
                “Confirmed” : "yes"
            },
            “friendId2” : {
                “Confirmed” : “Yes”,
            }
        },
        “friendId3” : {
            “CurrentUserId” : {
                “Confirmed” : "yes"
            },
            “friendId4” : {
                “Confirmed” : “Yes”,
            }
        },
}

1 个答案:

答案 0 :(得分:0)

您正在使用的结构将导致问题。我会把它改成这个简单的结构:

users
  user_0
    friends
      user_1: true
  user_1
    friends
      user_0: true
      user_2: true
  user_2
    friends
      user_1: true
      user_3: true
  user_3
    friends
      user_2: true

然后对包含我的用户ID的所有用户节点进行查询。

假设我是user_0,想要认识我的朋友,朋友

所以在这种情况下,我的朋友是user_1,而user_1的朋友是user_0(我)和user_2。结果应为user_2

这是代码。

let usersRef = self.ref.child("users")
let queryRef = usersRef.queryOrdered(byChild: "friends/user_0")
                       .queryEqual(toValue: true)
queryRef.observeSingleEvent(of: .value, with: { snapshot in

    var friendsSet = Set<String>()
    for child in snapshot.children {
        let snap = child as! DataSnapshot
        let friendsSnap = snap.childSnapshot(forPath: "friends")

        for friendChild in friendsSnap.children {
            let friendSnap = friendChild as! DataSnapshot
            let uid = friendSnap.key
            friendsSet.insert(uid)
        }
    }

    if let index = friendsSet.index(of: "user_0") {
        friendsSet.remove(at: index)
    }

    for uid in friendsSet {
        print(uid)
    } 
})

,结果是

user_2

同样,如果我是user_2并且想要了解我的朋友,朋友,我想了解user_1的朋友和user_3&#39;朋友

,结果是

user_0

这是一个简单的例子,但如果user_0有朋友user_1和user_2并且他们有多个朋友,那么输出将是他们所有的朋友。

哦 - 如果你想让它们排序......

let sortedFrieds = friendsSet.sorted()

讨论:

使这项工作真正的神奇之处在于Firebase深层查询 - 它允许我们在我们查询的子节点下方向下钻取一层。在这种情况下,我们查询所有user_x / friends / user_0等于true。

该快照将包含将my(user_0)作为子节点的所有用户。然后,我可以遍历那些用户朋友节点,并将每个密钥(即用户ID)添加到Set。

设置它正在使用而不是数组,因为我们只想存储唯一值,而且暂时不关心订购。

然后我们抛弃我的用户ID(user_0)并打印结果。