Здесь есть несколько ответов, которые содержат полезную информацию. Настоящий корень проблемы заключается в следующем:
var postData : [Any]!
Таким образом, когда доступ к массиву postData осуществляется до того, как в массиве есть данные, он становится равным nil и вылетает, потому что вы пытаетесь получить свойство .count из nil - это не работает.
return self.postData.count
Сделай это
var postData = [Post]()
Это создаст экземпляр массива postData со счетчиком 0.
Также обратите внимание, что с тех пор, когда вызывается func tableView (_ tableView: UITableView, numberOfRowsInSection, он вернет 0, потому что массив существует (не ноль) с нулевыми элементами
Вы можете свободно использовать viewDidLoad или viewDidAppear, как и в вашем вопросе, для заполнения вашего tableView до тех пор, пока ваш источник данных заполнен, вы вызываете tableView.reloadData, как отмечено в других ответах.
for post in posts! {
self.postData.append(post)
}
self.tableView.reloadData()
Обратите внимание, что в вашем вопросе одни и те же данные по существу хранятся в нескольких классовых переменных, что, вероятно, не нужно, поэтому вы можете удалить currentPost и postDictionary. Также будьте осторожны при работе со словарями; помните, что они неупорядочены, поэтому, если вы прочитаете некоторые посты и поместите их в словарь, они потеряют свой порядок.
Я собрал это вместе, чтобы вы пошли в правильном направлении:
class PostClass {
var postKey = ""
var post = ""
init(withKey: String, andPost: String) {
self.postKey = withKey
self.post = andPost
}
}
var postsArray = [PostClass]()
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
let postsRef = self.ref.child("posts")
postsRef.observeSingleEvent(of: .value, with: { snapshot in
let allPosts = snapshot.children.allObjects as! [DataSnapshot]
for postSnap in allPosts {
let postKey = postSnap.key
let post = postSnap.childSnapshot(forPath: "post").value as! String
let aPost = PostClass(withKey: postKey, andPost: post)
self.postsArray.append(aPost)
}
self.myTableView.reloadData()
// a test to print the post objects
for post in self.postsArray {
let key = post.postKey
let postText = post.post
print(key, postText)
}
})