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 提到的,首先,检查是否正在调用 getDatacompletion。如果没有,请尝试将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:使用从两个单独的子节点检索到的数据加载表格视图单元格

.observe firebase 方法 swift4 后代码未执行

来自 firebase 的数据未填充到我的表格视图中

未检索到 Firebase 用户的显示名称和照片网址

Swift:从 Firebase 检索数据并在表格视图中显示