为什么swift GCD在tableview cell imageView中不起作用

时间:2017-05-02 16:32:53

标签: ios swift image uitableview asynchronous

我做了一个聊天应用程序。当我聊天并发布图像消息给一个男人。我检查我的图片上传成功,并下载到本地文档失败。一个人的视图只有imageView具有清晰的背景。没有图像显示,我点击返回上一个视图,然后返回聊天视图。图像显示出来。发生了什么?如何让图像立即下载到本地?谢谢!

这是我的下载功能代码:

func ImageFromUrl(imageView:UIImageView,url:String) {

let documentsDirectoryURL = try! FileManager().url(for: .documentDirectory, in: .userDomainMask, appropriateFor: nil, create: true).appendingPathComponent("\(Image)/")

let fileName = url + ".jpg"
let fileURL = documentsDirectoryURL.appendingPathComponent(fileName)

let urlString = URL(string: url)

if let image = UIImage(contentsOfFile: fileURL.path)
{
    imageView.image = image
    return
}

DispatchQueue.global().async {
    let data = try? Data(contentsOf: urlString!) //make sure your image in this url does exist, otherwise unwrap in a if let check / try-catch

    if data != nil
    {
        if let image = UIImage(data: data!)
        {
            if !FileManager.default.fileExists(atPath: fileURL.path) {
                if let jpegData = UIImageJPEGRepresentation(image, 0.001)
                {
                    do {
                        try jpegData.write(to: fileURL, options: .atomic)
                    } catch {
                        debug(object: error)
                    }
                }
            } else {
                debug(object:"file already exists")
            }

            DispatchQueue.main.async {
                imageView.image = image//UIImage(data: data!)
            }
        }
    }
}
}


func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

let cell: CustomTableViewCell = CustomTableViewCell(style: .default, reuseIdentifier: nil)

if cell.isRight == false {  //A man's cell View

ImageFromUrl(imageView:cell.imageView,url:imageUrl)
//tableView.reloadRow(at:indexPath, with: .automatic)
//tableView.reloadRows(at: [indexPath], with: .automatic)
//tableView.reloadRow(UInt(contents.count-1), inSection: 0, with: .automatic)

}


}

1 个答案:

答案 0 :(得分:0)

由于这是推送到GCD,因此表格将在加载图像时完成更新。因此,您需要在表视图中重新加载数据。

变化:

DispatchQueue.main.async {
    imageView.image = image//UIImage(data: data!)
}

为:

DispatchQueue.main.async {
    imageView.image = image//UIImage(data: data!)
    self.tableView?.reloadData()
}

但这还不够,因为每次调用tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell时都会重新创建图像,并且您将陷入无限循环。我建议继承UITableViewCell子类来创建自己的包含image属性的单元格。然后,您可以告诉ImageFromURL(_)将图像保存到单元格的image属性,然后重新加载视图。