我又遇到一个新问题。我从一些JSON收集图片数据,并将其填充到结构为数据类型的数组中。一切正常,但是当我尝试在TableView中显示它时,图像丢失了-其余数据按需要显示。但是图像似乎也存储在数组中(请参阅后卫打印-添加了新图片-)。调度组也将完成“所有完成”。如果您可以看看并告诉我我做错了,那将很好。
Array:
var memeRawData: [MemeRawData] = []
Struct:
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出队:
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和名称-但图像似乎有问题。另外,控制台没有打印出任何错误。
谢谢!
您需要在主线程中设置图像,
编写此功能,
func setImage(imageView:UIImageView,url:URL){
let task = URLSession.shared.dataTask(with: url){ (data, response, error) in
if error != nil{
return
}
DispatchQueue.main.async {
let img = UIImage(data: data!)
imageView.image = img
}
}
task.resume()
}
然后在cellForItemAt中调用它>
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "memeAPICell")
cell?.textLabel?.text = memeRawData[indexPath.row].name
self.setImage(imageView:cell!.imageView!, url: URL(string: memeRawData[indexPath.row].url)!)
return cell!
}