Swift:数组结构图像在TableView中不可见

问题描述 投票:0回答:1

我又遇到一个新问题。我从一些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和名称-但图像似乎有问题。另外,控制台没有打印出任何错误。

谢谢!

json swift uiimage tableview urlsession
1个回答
0
投票

您需要在主线程中设置图像,

编写此功能,

 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!
}
© www.soinside.com 2019 - 2024. All rights reserved.