gpt4 book ai didi

ios - 在 TableView 中显示数据库中的图像错误

转载 作者:行者123 更新时间:2023-11-30 13:20:05 26 4
gpt4 key购买 nike

我有一个 TableView,我正在用从数据库检索的数据填充它。除了图像之外,一切正常。由于单元格重用行为,我正在 cellForRowAtIndexPath 中获取图像。我选择在 cellForRowAtIndexPath 中获取图像,因为在详细信息检索函数中(在 viewDidLoad 中触发),我需要执行另一个请求,这会导致其他问题(重新加载 tableview在存储图像网址之前)

问题是,当我快速滚动时,可重复使用的单元格在显示用户图像时会出现错误

override func viewDidLoad() {
super.viewDidLoad()
fetchData()
}

var theUser =

func fetchData() {
//.. after data is retrieved

var innerDict = [String:String]()

if let user = details.value![key] {
if let name = user["name"] {
// works
innerDict["name"] = name
}

if let image = user["imageName"] {
// gets the image name but at this point I need to;
// a) retrieve the url here (with another call), which will eventually fail
// to catch up with `innerDict` so `innerDict` won't contain `image` variable.
// ie;

myRef.downloadURLWithCompletion { (URL, error) -> Void in }

// b) Store the `image` name in innerDict and download image from url
// in `cellForRowAtIndexPath`. I chose this method:

innerDict["image"] = image
}

user[id] = innerDict
tableView.reloadData()
}

现在 tableView 像往常一样。

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

let cell = ...

// more stuff

if let imageName = user["image"] {
let storage = FIRStorage.storage()
let storageRef = storage.referenceForURL("gs://bucket.com").child(user[id]).child(imageName)

storageRef.downloadURLWithCompletion { (URL, error) -> Void in
if (error != nil) {
// handle
} else {
// I thought using Haneke would help to cache the image
cell.image.hnk_setImage(URL!)
}
}
}

这是我能到达的最近的一个。但是,当我快速滚动时,图像会出现显示错误。

<小时/>

编辑:

我也尝试过使用这种方法,但是使用这种方法会多次下载相同的图像,因此显示相同的图像需要时间。

islandRef.dataWithMaxSize(1 * 1024 * 1024) { (data, error) -> Void in
if (error != nil) {
// Uh-oh, an error occurred!
} else {
let image: UIImage! = UIImage(data: data!)
cell.userImage.hnk_setImage(image, key: "\(userID)")
}
}

但是,接近顶部时速度非常快。上面代码的唯一问题是当我快速滚动时出现故障。

<小时/>

编辑2

 var images = [UIImage]()

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

let cell = tableView.dequeueReusableCellWithIdentifier("ItemCell", forIndexPath: indexPath) as! ItemDetailTableViewCell

let item = items[indexPath.section][indexPath.row]

if let uid = item["owner"] as? String {
if let user = users[uid] {
if let imageName = user["image"] {
if let img: UIImage = images[indexPath.row] { // crash here "fatal error: Index out of range"
cell.userImage.image = img
}
} else {
let storage = FIRStorage.storage()
let storageRef = storage.referenceForURL("gs://bucket").child(uid).child(imageName)

storageRef.downloadURLWithCompletion { (URL, error) -> Void in
if (error != nil) {

} else {
dispatch_async(dispatch_get_main_queue(), {
cell.userImage.hnk_setImageFromURL(URL!)
self.images[indexPath.row] = cell.image.image!
})
}
}
}
}





}

最佳答案

我认为你应该从 url 保存图像并在单元格要重用时显示图像,希望这能解决你的问题

 var myImages =  [String: UIImage]()


func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier("ItemCell", forIndexPath: indexPath) as! ItemDetailTableViewCell
let item = items[indexPath.section][indexPath.row]

if let img: UIImage = myImages["\(indexPath.section)\(indexPath.row)"] {
cell.image.image = img
} else {
if let uid = item["owner"] as? String {
if let imageName = user["image"] {
let storage = FIRStorage.storage()
let storageRef = storage.referenceForURL("gs://bucket.com").child(user[id]).child(imageName)
storageRef.downloadURLWithCompletion { (URL, error) -> Void in
if (error != nil) {
cell.image = UIImage(named: "placeholder") // put default Image when failed to download Image
} else {
dispatch_async(dispatch_get_main_queue(), {
cell.image.hnk_setImage(URL!)
// Store the image in to our cache
self.myImages["\(indexPath.section)\(indexPath.row)"]= cell.image.image
})
}
}
}
}

}

关于ios - 在 TableView 中显示数据库中的图像错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37853252/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com