【发布时间】:2020-08-28 12:14:21
【问题描述】:
我又问了一个新问题。 我正在从一些 JSON 中收集图片数据,并将其填充到一个以 Struct 作为数据类型的数组中。 一切正常,但是当我尝试在 TableView 中显示它时,图像丢失 - 其余数据正在按需要显示。 但是图像似乎也存储在数组中(请参阅警卫后的打印---添加了新图片---)。 Dispatch Group 也完成了“All Done”。 如果您能看一下并告诉我我做错了什么,那就太好了。
数组:
var memeRawData: [MemeRawData] = []
结构:
struct MemeRawData {
let name: String?
let url: String?
let img: UIImage?
}
调度组从 JSON 中收集数据并下载图像并将其附加到数组中:
var meme = MemeRawData(name: "", url: "", img: UIImage())
var memeName = ""
var memeURL = ""
var memeIMG = UIImage()
let g = DispatchGroup()
MemeAPI.requestAPIImageData { (imgData, error) in
imgData?.data.memes.forEach{
memeData in
g.enter()
memeName = memeData.name!
memeURL = memeData.url!
MemeAPI.requestAPIImageFile(url: URL(string: memeData.url!)!) { (image, error) in
guard let image = image else {
print("PIC IS NIL")
return
}
memeIMG = image
print("-----NEW PIC ADDED-------")
}
meme = MemeRawData(name: memeName, url: memeURL, img: memeIMG)
self.memeRawData.append(meme)
g.leave()
}
g.notify(queue:.main) {
print("All done")
}
}
从 URL 获取图片的函数:
class func requestAPIImageFile(url: URL, completionHandler: @escaping (UIImage?, Error?) -> Void) {
let task = URLSession.shared.dataTask(with: url) { (data, response, error) in
guard let data = data else {
completionHandler(nil, error)
return}
let downloadedImage = UIImage(data: data)
completionHandler(downloadedImage, nil)
}
task.resume()
}
并完成它的tableView dequeue:
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "memeAPICell")
cell?.textLabel?.text = memeRawData[indexPath.row].name
cell?.imageView?.image = memeRawData[indexPath.row].img
return cell!
}
就像我说的 JSON 解析工作正常,因为我可以显示所有 URL 和名称 - 但图像似乎有问题。控制台也没有打印出任何错误。
提前致谢!
【问题讨论】:
-
只是时间问题吗?如果图像是在 tableview 显示后下载的,那么你需要在数据到达时刷新 tableview 的每一行
-
我同意@Russell。当您尝试创建“MemeRawData”对象时,图像尚未下载。
-
@Russell 感谢您的意见!这也是有道理的。有没有办法“保持”直到图像被下载并可以存储在对象中?我对 swift 很陌生
-
最好的方法是展示你拥有的东西,然后再更新——我们不想保留任何东西。在 'cellForRowAt' 中,我们应该检查图像是否可用 - 如果有,则显示它,如果没有,则显示'即将推出的图像...图片',然后在数据到来时刷新特定行。如果没有人超过我,我将很快分享一个例子
-
@Russell 那太好了!非常感谢!
标签: json swift uiimage tableview urlsession