J'ai un tableau de classe de notification composé de valeurs String et de 3 autres classes (classe utilisateur, photo et vidéo). J'ai des problèmes en ajoutant la classe de notification à une vue de collection. Le problème est que si Photo Class est vide, il échoue ou si Video Class est vide, il ne parvient pas à ajouter. J'ai rendu toutes les classes facultatives dans le tableau de classe de notification, mais cela ne semble pas faire de différence, donc je ne sais pas quoi faire ensuite. L'aide serait très appréciée s'il vous plaît. Merci d'avance!Ajouter un tableau de classes qui contient d'autres tableaux de classes
notification Tableau
class notification {
var profilePic: String?
var fullName: String?
var descriptionLabel: String?
var descriptionImage: String?
var postID: String?
var user: userAccount?
var post: Post?
var videoPost: videoPost?
var postDescription: String?
var date: NSNumber?
init (user: userAccount, post: Post, videoPost: videoPost, dictionary: [String: Any])
{
self.videoPost = videoPost
self.post = post
self.user = user
self.postDescription = dictionary["postDescription"] as? String ?? ""
self.fullName = dictionary["fullName"] as? String ?? ""
self.profilePic = dictionary["profilePic"] as? String ?? ""
self.descriptionLabel = dictionary["textDesciption"] as? String ?? ""
self.descriptionImage = dictionary["desciptionImage"] as? String ?? ""
self.postID = dictionary["postID"] as? String ?? ""
self.date = dictionary["notificationDate"] as? NSNumber
}
CollectionViewController
func loadData(){
let userID = Auth.auth().currentUser!.uid
Database.database().reference().child("notification").child(userID).observe(.childAdded, with: { (snapshot) in
guard let dictionary = snapshot.value as? [String: Any] else { return }
let uid = dictionary["uid"] as? String
let postId = dictionary["postID"] as? String
Database.fetchUserWithUID(uid: uid!, completion: { (snapshot) in
Database.fetchPostWithUID(uid: userID, postId: postId!, completion: { (postShot) in
Database.fetchVideoPostWithUID(uid: userID, postId: postId!, completion: { (videoShot) in
let comment = notification(user: snapshot, post: postShot, videoPost: videoShot, dictionary: dictionary)
self.notifications.append(comment)
self.notificationTableView?.reloadData()
})
})
})
})
}
extension Database {
static func fetchUserWithUID(uid: String, completion: @escaping (userAccount) ->()) {
Database.database().reference().child("user").child(uid).observeSingleEvent(of: .value, with: { (snapshot) in
let user = userAccount(snapshot:snapshot)
completion(user)
})
}
static func fetchPostWithUID(uid: String, postId: String, completion: @escaping (Post) ->()) {
Database.database().reference().child("post").child(uid).child(postId).observeSingleEvent(of: .value, with: { (snapshot) in
if snapshot.exists() {
let post = Post(snapshot:snapshot)
completion(post)
}else{
// Not sure what to write here when snapshot is equal to nil
})
}
static func fetchVideoPostWithUID(uid: String, postId: String, completion: @escaping (videoPost) ->()) {
Database.database().reference().child("videoPost").child(uid).child(postId).observeSingleEvent(of: .value, with: { (snapshot) in
if snapshot.exists(){
let post = videoPost(snapshot:snapshot)
completion(post)
}else{
// Again not sure what to write here when snapshot is equal to nil
}
})
}
Vous pouvez utiliser 'statique func fetchPostWithUID (uid: String, postId: String, achèvement: @escaping (Post) ->()) {'puis dans autre partie vous pouvez appeler le gestionnaire de complétion comme ceci' achèvement (nul) 'et même pour les autres fonctions – 3stud1ant3
Merci @ 3stud1ant3 pour la réponse.J'ai mis à jour mon code avec votre suggestion mais maintenant je reçois une erreur fatale: trouvé de manière inattendue nil lors du déballage d'une valeur optionnelle en ligne let comment = notification (utilisateur: instantané, post: postShot, videoPost: videoShot, dictionnaire: dictionnaire) –
aurait besoin de mettre à jour l'init de la notification comme ceci: 'init (utilisateur: userAccount, post: Post?, videoPost: videoPost?, dictionnaire: [String: Any])' – 3stud1ant3