我正在尝试使用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”,
}
},
}
答案 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)并打印结果。