swift:来自firebase的照片未显示在表格视图中
Posted
技术标签:
【中文标题】swift:来自firebase的照片未显示在表格视图中【英文标题】:swift: photos from firebase not showing in table view 【发布时间】:2020-10-21 12:44:15 【问题描述】:我已经查看了类似的问题和问题,并尝试了他们的建议,但似乎没有一个有效,我似乎无法找到为什么视图中没有显示任何内容。以下是我的代码。
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 中的集合吗?到目前为止,我只有用户和帖子作为集合。我将尝试为帖子实现一个类,但你能给我一个指针或告诉我在哪里查看如何将数据加载到数据源。我可以只实现缓存还是需要做其他事情?非常感谢您的帮助!
【参考方案1】:
-
正如 Prettygeek 提到的,首先,检查是否正在调用
getData
的 completion
。如果没有,请尝试将imageRef
保留在tableView(cellForRowAt:)
范围之外(仅用于调试)。
检查哪个线程getData
调用了它的completion
,很可能它与main
线程不同,你不应该从main
以外的线程调用UIKit。 DispatchQueue.main.async
会在那里派上用场。
【讨论】:
你们是对的,它没有被调用,但即使在if let imageName..
之后我尝试打印但它没有运行,你有什么建议?我也不确定如何检查在 tbh 上调用了哪个线程 getData
。
仅供参考。 Firebase 闭包中不需要 DispatchQueue.main.async。所有网络调用都在后台线程上完成,所有 UI 调用都在主线程上完成。以上是关于swift:来自firebase的照片未显示在表格视图中的主要内容,如果未能解决你的问题,请参考以下文章
Swift 3 和 Firebase - Tableview 未更新
Firebase - iOS Swift:使用从两个单独的子节点检索到的数据加载表格视图单元格