Ios 从Firebase下载帖子时出错';s数据库(Swift 3)
我有一个社交应用程序,上面有类似Facebook的帖子,但当我尝试下载帖子时,它返回零Ios 从Firebase下载帖子时出错';s数据库(Swift 3),ios,firebase,swift3,xcode8,Ios,Firebase,Swift3,Xcode8,我有一个社交应用程序,上面有类似Facebook的帖子,但当我尝试下载帖子时,它返回零 FIRDatabase.database().reference().child("following").child(FIRAuth.auth()!.currentUser!.uid).queryOrderedByValue().queryEqual(toValue: true).observeSingleEvent(of: .value, with: {(snap) in if let snapD
FIRDatabase.database().reference().child("following").child(FIRAuth.auth()!.currentUser!.uid).queryOrderedByValue().queryEqual(toValue: true).observeSingleEvent(of: .value, with: {(snap) in
if let snapDict = snap.value as? [String:AnyObject]{
for each in snapDict{
FIRDatabase.database().reference().child("Posts").child(String(each.key)).queryOrdered(byChild: "timestamp").observeSingleEvent(of: .value, with: {(snapshot) in
if (snapshot.value != nil)
{
self.Posts.append(snapshot.value as! NSDictionary)
}
}){(error) in
print(error.localizedDescription)
}
}
}
self.homeTableView.reloadData()
self.aivLoading.stopAnimating()
})
经过一些调试后,我将问题归结为返回nil值的这行代码
FIRDatabase.database().reference().child("Posts").child(String(each.key)).queryOrdered(byChild: "timestamp").observeSingleEvent(of: .value, with: {(snapshot) in
我的代码的另一部分确实返回了您跟踪的人的列表,并且循环了它
这是我数据库的结构
{
"Posts" : {
"dEXaVLDOSPfJa3zTyUNqAEtVuMR2" : {
"-KbHUnL-RveUQa3MPSWp" : {
"latitud" : "21.111401000574",
"longitud" : "-89.6112191677094",
"text" : "Fiesta en la Anahuac!!! ",
"timestamp" : "1485295269.30773",
"ubicacionN" : "Universidad Anáhuac Mayab"
},
"-KbI1azr6uFel-5uTZOD" : {
"latitud" : "Optional(21.018988764483463)",
"longitud" : "Optional(-89.614319546492695)",
"text" : "Hola chicos",
"timestamp" : "1485304393.77929",
"ubicacionN" : "Calle 53-A 341"
},
"-KbNQWxjQhc0Ce_ZQbq9" : {
"latitud" : "Optional(21.019219877217914)",
"longitud" : "Optional(-89.614173537203683)",
"text" : "Hola",
"timestamp" : "1485394812.83039",
"ubicacionN" : "Calle 53 341"
}
},
"mt0fzirhMhazIcy90MRWuRpTfmE2" : {
"-KbQOWfUnzY1JiS61J6-" : {
"latitud" : "Optional(21.111502615883129)",
"longitud" : "Optional(-89.611767497121221)",
"text" : "Hola chicos!",
"timestamp" : "1485444619.10931",
"ubicacionN" : "Carretera Mérida-Progreso 96"
}
}
},
"follower" : {
"dEXaVLDOSPfJa3zTyUNqAEtVuMR2" : {
"mt0fzirhMhazIcy90MRWuRpTfmE2" : true
},
"mt0fzirhMhazIcy90MRWuRpTfmE2" : {
"dEXaVLDOSPfJa3zTyUNqAEtVuMR2" : true
}
},
"following" : {
"dEXaVLDOSPfJa3zTyUNqAEtVuMR2" : {
"mt0fzirhMhazIcy90MRWuRpTfmE2" : true
},
"mt0fzirhMhazIcy90MRWuRpTfmE2" : {
"dEXaVLDOSPfJa3zTyUNqAEtVuMR2" : true
}
},
"handles" : {
"jcadmin" : "mt0fzirhMhazIcy90MRWuRpTfmE2",
"jcbest" : "dEXaVLDOSPfJa3zTyUNqAEtVuMR2"
},
"user_profiles" : {
"dEXaVLDOSPfJa3zTyUNqAEtVuMR2" : {
"about" : "Hola Mundo",
"handle" : "jcbest",
"name" : "Juan Carlos Estevez Rodriguez",
"profile_pic" : "https://firebasestorage.googleapis.com/v0/b/jalo-267da.appspot.com/o/user_profiles%2FOptional(%22dEXaVLDOSPfJa3zTyUNqAEtVuMR2%22)%2Fprofile_pic?alt=media&token=bfc3c516-7849-472c-b7cd-9668965a5dbe"
},
"mt0fzirhMhazIcy90MRWuRpTfmE2" : {
"about" : "Hola chicos",
"handle" : "jcadmin",
"name" : "Juan Carlos",
"profile_pic" : "https://firebasestorage.googleapis.com/v0/b/jalo-267da.appspot.com/o/user_profiles%2FOptional(%22mt0fzirhMhazIcy90MRWuRpTfmE2%22)%2Fprofile_pic?alt=media&token=b741b6c1-0bc5-446d-a1e5-159b21e770d2"
}
}
}
这是我的全部代码。
如果这是一个有效的数据集,那么您在查询中查找的内容是错误的,但可能是我不理解您的数据 我假设
当前用户
是dEXaVLDOSPfJa3zTyUNqAEtVuMR2
,并且获取以下内容的第一个查询应该返回mt0fzirhmhazicy90mrwurpfme2
您在帖子中没有任何对mt0fzirhMhazIcy90MRWuRpTfmE2的引用,因此您永远不会在第二次查询中返回任何内容…经过大量调试后,我发现了问题,在这一部分中,问题是
FIRDatabase.database().reference().child("Posts").child(String(each.key)).queryOrdered(byChild: "timestamp").observeSingleEvent(of: .value, with: {(snapshot) in
if (snapshot.value != nil)
{
self.Posts.append(snapshot.value as! NSDictionary)
}
}){(error) in
print(error.localizedDescription)
}
查询实际上下载了所有帖子,但它们被保存在一个非静态变量(noob错误)中,因此我唯一要做的就是在收到每篇帖子后重新加载数据,也就是说,它需要如下所示:
FIRDatabase.database().reference().child("Jalas").child(each.key).queryOrderedByKey().observe(.childAdded, with: { (snapshot:FIRDataSnapshot) in
print(snapshot.value as! NSDictionary)
self.Jalas.append(snapshot.value as! NSDictionary)
self.homeTableView.reloadData()
})
self.homeTableView.delegate = self
self.homeTableView.dataSource = self
self.loggedInUser = FIRAuth.auth()?.currentUser
print("LoggedInUser: " + (self.loggedInUser?.uid)!)
FIRDatabase.database().reference().child("following").child(FIRAuth.auth()!.currentUser!.uid).queryOrderedByValue().queryEqual(toValue: true).observeSingleEvent(of: .value, with: {(snap) in
//if let snapDict = snap.value as? [String:AnyObject]{
let sanpDict = snap.value as? [String:AnyObject]
if (sanpDict != nil)
{
for each in sanpDict!{
print("each.key es: " + String(each.key))
FIRDatabase.database().reference().child("Jalas").child(each.key).queryOrderedByKey().observe(.childAdded, with: { (snapshot:FIRDataSnapshot) in
print(snapshot.value as! NSDictionary)
self.Jalas.append(snapshot.value as! NSDictionary)
self.homeTableView.reloadData()
})
}
}
self.aivLoading.stopAnimating()
})
因此,完整的代码如下所示:
FIRDatabase.database().reference().child("Jalas").child(each.key).queryOrderedByKey().observe(.childAdded, with: { (snapshot:FIRDataSnapshot) in
print(snapshot.value as! NSDictionary)
self.Jalas.append(snapshot.value as! NSDictionary)
self.homeTableView.reloadData()
})
self.homeTableView.delegate = self
self.homeTableView.dataSource = self
self.loggedInUser = FIRAuth.auth()?.currentUser
print("LoggedInUser: " + (self.loggedInUser?.uid)!)
FIRDatabase.database().reference().child("following").child(FIRAuth.auth()!.currentUser!.uid).queryOrderedByValue().queryEqual(toValue: true).observeSingleEvent(of: .value, with: {(snap) in
//if let snapDict = snap.value as? [String:AnyObject]{
let sanpDict = snap.value as? [String:AnyObject]
if (sanpDict != nil)
{
for each in sanpDict!{
print("each.key es: " + String(each.key))
FIRDatabase.database().reference().child("Jalas").child(each.key).queryOrderedByKey().observe(.childAdded, with: { (snapshot:FIRDataSnapshot) in
print(snapshot.value as! NSDictionary)
self.Jalas.append(snapshot.value as! NSDictionary)
self.homeTableView.reloadData()
})
}
}
self.aivLoading.stopAnimating()
})
String(each.key)
是否准确返回您要查找的内容?如果删除QueryOrderBy子句,将返回什么?@Russell yes的确,String(each.key)
返回其他用户的UID。我刚刚尝试删除queryOrderBy,但也没有任何结果。您使用的是磁盘持久性吗?我不这么认为@AlissonEnz我不知道它是什么:(但是如果你能在Firebase控制台中看到数据,你应该能够检索到它!你的权利,很抱歉这是我的数据库的未更新版本。让我更新它。@Russelldone@Russell,因为你可以看到我所做的是获取你所跟踪的人和你的UID下的人的查询,但只有那些值等于true的人(如果用户解除跟踪,则可能为false)each.key
确实返回mt0fzirhmhazicy90mrwurpfme2
我使用打印检查它(each.key)
和@Russell确实,在这种情况下,让asumecurrentUser
是dEXaVLDOSPfJa3zTyUNqAEtVuMR2
。真奇怪。对我来说效果很好。你有信心帖子的数据已经存储在Firebase中了吗?你能包括Firebase控制台的屏幕截图吗?该死,是啊哈@Russell I d直接从firebase下载JSON并复制粘贴。:(有什么想法吗?