在另一个提取中获取Firebase

时间:2017-08-08 15:23:09

标签: ios swift firebase firebase-realtime-database

所以我在我的应用程序中创建了一个论坛,在获取数据库中的主题时,我还需要获取一些用户信息,如原始海报的图片和用户名,将其放在桌面视图单元格上。

为了保持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()
                                    }
                                }
                            }
                        })
                    }
                }            }
        }
    }
    )
}

提前致谢。

1 个答案:

答案 0 :(得分:0)

我最终决定在获取所有主题之后获取用户信息,然后循环遍历主题数组并附加每个主题的用户信息。

实施例

1 - 获取所有主题并创建数组

2 - 对于数组{

中的每个主题

使用topic.email

等属性在Firebase上获取用户

设置如下:

topic.imageUrl = user.imageUrl

topic.username = user.username

}

重新加载表格视图