私は自分のアプリケーション内にフォーラムを作成しています。データベースのトピックをフェッチするときには、元のポスターのユーザー名などのユーザー情報もフェッチしてテーブルビューのセルに配置する必要があります。別のフェッチ内にFirebaseをフェッチする
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()
}
}
}
})
}
} }
}
}
)
}
ありがとうございます。