【发布时间】:2023-03-30 10:00:01
【问题描述】:
我已经查看了类似的问题和问题,并尝试了他们的建议,但似乎没有一个有效,我似乎无法找到为什么视图中没有显示任何内容。以下是我的代码。
class HomeViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {
@IBOutlet weak var postsTableView: UITableView!
var posts = NSMutableArray()
override func viewDidLoad() {
super.viewDidLoad()
postsTableView.estimatedRowHeight = 521
postsTableView.rowHeight = UITableView.automaticDimension
postsTableView.delegate = self
postsTableView.dataSource = self as UITableViewDataSource
loadData()
}
func loadData() {
Database.database().reference().child("posts").observeSingleEvent(of: .value, with: { (snapshot) in
if let postsDictionary = snapshot.value as? [String: AnyObject]{
for post in postsDictionary {
self.posts.add(post.value)
}
self.postsTableView.reloadData()
}
})
}
func numberOfSections(in tableView: UITableView) -> Int {
// #warning Incomplete implementation, return the number of sections
return 1
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
// #warning Incomplete implementation, return the number of rows
return self.posts.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) as! PostTableViewCell
let post = self.posts[indexPath.row] as! [String: AnyObject]
if let imageName = post["posts"] as? String {
let imageRef = Storage.storage().reference().child("posts/\(String(describing: imageName))")
imageRef.getData(maxSize: 15 * 1024 * 1024, completion: { (data, error) -> Void in
if error == nil {
//successful
let image = UIImage(data: data!) //create an image with data sent from database
cell.postImageView.image = image
cell.postImageView.alpha = 0
UIView.animate(withDuration: 0.4, animations: {
cell.postImageView.alpha = 1
})
} else {
//error
print("Error downloading the image: \(String(describing: error?.localizedDescription))")
}
tableView.reloadData()
})
}
return cell
}
}
屏幕只显示表格视图的空单元格。
如果我的问题格式不正确,请原谅。
【问题讨论】:
-
我认为 imageRef 正在释放其回调,因此没有调用回调。您是否检查过是否调用了回调?
-
Tableviews 被设计为轻量级和响应式 - 从单元格内加载数据会影响性能并提高成本。单元格一直出列并重用,因此每次发生这种情况时,代码都必须重新下载图像。您应该将数据加载到数据源中,并且 tableView 从该数据源中提取数据,从而保持快速。调查它以及预取和caching。
-
哦,不要在已经调用它的函数中执行
tableView.reloadData()。例如.reloadData 调用func tableView(_ tableView: UITableView, cellForRowAt所以不要在该函数中再次调用它,因为这将调用一个无限循环的重新加载数据。 -
其他几件事。此时您不应该这样做
var posts = NSMutableArray()。让我们成为 Swifty 并创建一个 Post 类来存储每个帖子数据并将其存储在数组let postsArray = [PostClass]()中。其次,if let postsDictionary = snapshot.value将使您的帖子按随机顺序排列 - 字典没有顺序。最后是您的数组包含 [String, AnyObject]。什么是任何对象?它只是一个名称,所以将其保留为避免String(describing: imageName)的字符串。所有的键都称为“post”吗?您的 Firebase 结构是什么? -
@Jay 按键是指firebase 中的集合吗?到目前为止,我只有用户和帖子作为集合。我将尝试为帖子实现一个类,但你能给我一个指针或告诉我在哪里查看如何将数据加载到数据源。我可以只实现缓存还是需要做其他事情?非常感谢您的帮助!
标签: ios swift firebase firebase-realtime-database