所以我在我的应用程序中创建了一个论坛,在获取数据库中的主题时,我还需要获取一些用户信息,如原始海报的图片和用户名,将其放在桌面视图单元格上。
为了保持Firebase数据库保持平稳的建议,我可以通过密钥单独进行参考搜索,而不是作为主题的子项。
我不能保留像opImage和opUsername这样的东西作为主题的子节点,因为如果用户更改其用户名或个人资料图像,我需要在他参与的每个主题上更改它。
处理此问题的最佳方法是什么?
从Firebase获取的方法看起来像这样。该实现的问题在于Firebase调用是异步的,并且无法保证图像将附加到正确的主题。
DataService.ds.Topics_Base.child(cat.key!).observeSingleEvent(of:.value, with: { (snapshot) in
if let snapshots = snapshot.children.allObjects as? [FIRDataSnapshot] {//snapshots = all topics
for top in snapshots{
if let dict = top.value as? Dictionary<String,AnyObject>{
guard let title = dict["title"] as? String,let text = dict["text"] as? String,let time = dict["time"] as? String,let username = dict["username"] as? String,let timeSimple = dict["time-simple"] as? String,let lastPost = dict["last-post"] as? String,let open = dict["open"] as? Bool else{
continue
}
let newTopic = Topic(subject: title, text: text, time: time, topicKey: top.key, username: username)
self.allTopics.append(newTopic)
print(self.allTopics.count)
if let email = dict["email"] as? String{
//FETCH USER INFO FROM EMAIL FETCHED
let validEmail = HelperMethods.removeSpecialCharactersFromEmail(email: email)
DataService.ds.Users_Base.child(validEmail).observeSingleEvent(of: .value, with: {(snapshot) in
if let userDict = snapshot.value as? Dictionary<String,AnyObject>{
if let imgUrl = userDict["profile_image_url"] as? String{
self.allTopics[currentIndex].opImageUrl = imgUrl
}
self.allTopics.append(newTopic)
if (totalTopics == snapshots.count){
DispatchQueue.main.async {
self.allTopics.sort { $0.lastPostTime! > $1.lastPostTime!}
self.tableView.reloadData()
self.refreshControl.endRefreshing()
}
}
}
})
}
} }
}
}
)
}
提前致谢。
答案 0 :(得分:0)
我最终决定在获取所有主题之后获取用户信息,然后循环遍历主题数组并附加每个主题的用户信息。
实施例
1 - 获取所有主题并创建数组
2 - 对于数组{
中的每个主题使用topic.email
等属性在Firebase上获取用户设置如下:
topic.imageUrl = user.imageUrl
topic.username = user.username
}
重新加载表格视图