• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

ios - Firebase iOS : Download image for TableView - Best Practice

[复制链接]
菜鸟教程小白 发表于 2022-12-13 00:32:35 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题

我遵循了 Ray Wenderlich (Link) 的 Firebase 教程,并采用了他的方法,使用来自观察方法的快照初始化对象(在我的情况下为“位置”类型):

上课地点:

init(snapshot: FIRDataSnapshot) {
    identifier = snapshot.key
    let snapshotValue = snapshot.value as! [String : AnyObject]
    type = snapshotValue["type"] as! String
    name = snapshotValue["name"] as! String
    address = snapshotValue["address"] as! String
    latitude = Double(snapshotValue["latitude"] as! String)!
    longitude = Double(snapshotValue["longitude"] as! String)!
    avatarPath = snapshotValue["avatarPath"] as! String

    ref = snapshot.ref
}

LocationsViewController:

databaseHandle = locationsRef?.queryOrdered(byChild: "name").observe(.value, with: { (snapshot) in

        var newLocations:[Location] = []

        for loc in snapshot.children {
            let location = Location(snapshot: loc as! FIRDataSnapshot)

            newLocations.append(location)
        }

        self.locations = newLocations
        self.tableView.reloadData()
})

这确实像一个魅力,但现在我正在尝试加载存储在存储引用“avatarPath”下的图像。 我的尝试奏效了,但图像需要很长时间才能加载。有没有更好的方法/地方来加载这些图像?

我的尝试 1:

databaseHandle = locationsRef?.queryOrdered(byChild: "name").observe(.value, with: { (snapshot) in

        var newLocations:[Location] = []

        for loc in snapshot.children {
            let location = Location(snapshot: loc as! FIRDataSnapshot)

            newLocations.append(location)
        }

        self.locations = newLocations
        self.tableView.reloadData()

        //Load images       
        for loc in self.locations {
            let imagesStorageRef = FIRStorage.storage().reference().child(loc.avatarPath)
            imagesStorageRef.data(withMaxSize: 1*1024*1024, completion: { (data, error) in
                if let error = error {
                    print(error.localizedDescription)
                } else {
                    loc.avatarImage = UIImage(data: data!)!
                    self.tableView.reloadData()
                }
            })
        }
})

我的第二次尝试(在 Location 类中):

init(snapshot: FIRDataSnapshot) {
    identifier = snapshot.key
    let snapshotValue = snapshot.value as! [String : AnyObject]
    type = snapshotValue["type"] as! String
    name = snapshotValue["name"] as! String
    address = snapshotValue["address"] as! String
    latitude = Double(snapshotValue["latitude"] as! String)!
    longitude = Double(snapshotValue["longitude"] as! String)!
    avatarPath = snapshotValue["avatarPath"] as! String

    ref = snapshot.ref

    super.init()
    downloadImage()
}

func downloadImage() {
    let imagesStorageRef = FIRStorage.storage().reference().child(self.avatarPath)
    imagesStorageRef.data(withMaxSize: 1*1024*1024, completion: { (data, error) in
        if let error = error {
            print(error.localizedDescription)
        } else {
            self.avatarImage = UIImage(data: data!)!
        }
    })
}

提前谢谢你!

尼哥



Best Answer-推荐答案


实现这一点的最佳方法是在单元格函数的加载中异步加载。我的意思是:

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell{
DispatchQueue.main.async {
   let imagesStorageRef = FIRStorage.storage().reference().child(self.locations[indexPath.row].avatarPath)
        imagesStorageRef.data(withMaxSize: 1*1024*1024, completion: { (data, error) in
            if let error = error {
                print(error.localizedDescription)
            } else {
                locations[indexPath.row].avatarImage = UIImage(data: data!)!
tableView.reloadRows(at indexPaths: [indexPath], with animation: .none)
            }
        })
    }

}

关于ios - Firebase iOS : Download image for TableView - Best Practice,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43228922/

回复

使用道具 举报

懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注0

粉丝2

帖子830918

发布主题
阅读排行 更多
广告位

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap