OStack程序员社区-中国程序员成长平台

标题: ios - Firebase iOS : Download image for TableView - Best Practice [打印本页]

作者: 菜鸟教程小白    时间: 2022-12-13 00:32
标题: ios - Firebase iOS : Download image for TableView - Best Practice

我遵循了 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/






欢迎光临 OStack程序员社区-中国程序员成长平台 (https://ostack.cn/) Powered by Discuz! X3.4