我做了一个聊天应用程序。当我聊天并发布图像消息给一个男人。我检查我的图片上传成功,并下载到本地文档失败。一个人的视图只有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)
}
}
答案 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
属性,然后重新加载视图。