Я создаю коллекционное представление, содержащее комментарии, где я извлекаю комментарии, идентификатор комментария, идентификатор сообщения и идентификатор пользователя из Firebase. Когда я пытаюсь получить информацию о пользователе, связанную с идентификатором пользователя, и добавляю комментарии, это не работает. Я думаю, это потому, что я добавляю snapshot.value в пользовательскую ссылку, и поэтому у него больше нет ссылки на комментарий. Как получить как комментарий, так и имя пользователя, связанное с UID, и отобразить его в представлении коллекции комментариев?
Вот как выглядит иерархия в Firebase:
Нажмите здесь.
По моему мнению, пост-контроллер, я получаю комментарии вот так.
var comments = [Comment]()
fileprivate func fetchComments() {
guard let postID = self.post?.id else {return}
let commentRef = Database.database().reference().child("comments").child(postID)
commentRef.observe(.childAdded, with: { (snapshot) in
guard let dict = snapshot.value as? [String: Any] else {return}
guard let uid = dict["uid"] as? String else {return}
let userRef = Database.database().reference().child("users/\(uid)/profile")
userRef.observe(.value, with: { snapshot in
if (snapshot.value as? [String: Any]) != nil {
//let snap = snapshot.value as? [String: Any]
var comment = Comment(dictionary: dict)
comment.user = snapshot.value as? User
self.comments.append(comment)
print(comment)
self.commentCollectionView.reloadData()
}
})
})
}
Настройка представления коллекции для комментариев, как это.
extension ViewPostViewController: UICollectionViewDelegate, UICollectionViewDataSource {
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
return comments.count
}
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "commentCell", for: indexPath) as! CommentCollectionViewCell
cell.comment = self.comments[indexPath.item]
return cell
}
}
My CommentsCollectionViewCell.swift имеет этот код:
class CommentCollectionViewCell: UICollectionViewCell {
@IBOutlet weak var usernameLabel: UILabel!
@IBOutlet weak var commentLabel: UILabel!
@IBOutlet weak var timePostedLabel: UILabel!
var comment: Comment? {
didSet {
guard let comment = comment else {return}
guard let username = comment.user?.username else {return}
print(username)
commentLabel.text = comment.comment
usernameLabel.text = comment.user?.username
}
}
}
Класс модели комментариев имеет этот код:
struct Comment {
var user: User?
let comment: String
let uid: String
init(dictionary: [String: Any]) {
self.comment = dictionary["comment"] as? String ?? ""
self.uid = dictionary["uid"] as? String ?? ""
}
}