我在表视图中显示 JSON 图像时遇到问题

2024-02-14

我正在尝试显示来自 API 的图像。这些图像位于 URL 内,我想用所有数组填充表视图,但它在表视图中只显示一张图像。

这是我的代码:

   struct Autos {
        let Marca:String
        let Modelo:String
        let Precio:String
        let RutaImagen:String

    init?(_ dict:[String:Any]?){
        guard let _dict = dict,
            let marca=_dict["Marca"]as?String,
            let modelo=_dict["Modelo"]as?String,
            let precio=_dict["Precio"]as?String,
            let rutaImagen=_dict["RutaImagen"]as?String

            else { return nil }

        self.Marca = marca
        self.Modelo = modelo
        self.Precio = precio
        self.RutaImagen = rutaImagen
   }
}

  var arrAutos = [Autos]()

 func getImage(from string: String) -> UIImage? {
        // Get valid URL
        guard let url = URL(string: string)
            else {
                print("Unable to create URL")
                return nil
        }
    var image: UIImage? = nil
    do {
        // Get valid data
        let data = try Data(contentsOf: url, options: [])

        // Make image
        image = UIImage(data: data)
    }
    catch {
        print(error.localizedDescription)
    }

    return image
}

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return 9
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
      let cell = tableView.dequeueReusableCell(withIdentifier: "carsCell", for: indexPath) as! CarsDetailTableViewCell
      let url = URL(string: "http://ws-smartit.divisionautomotriz.com/wsApiCasaTrust/api/autos")!

        let task = URLSession.shared.dataTask(with: url) {
            (data, response, error) in

            guard let dataResponse = data, error == nil else {
                print(error?.localizedDescription ?? "Response Error")
                return
            }

            do {
                let jsonResponse = try JSONSerialization.jsonObject(with: dataResponse, options: []) as? NSArray
                self.arrAutos = jsonResponse!.compactMap({ Autos($0 as? [String:String])})

                DispatchQueue.main.async {
                    // Get valid string
                    let string = self.arrAutos[indexPath.row].RutaImagen
                    if let image = self.getImage(from: string) {
                        // Apply image
                        cell.imgCar.image = image
                    }
                    cell.lblBrand.text = self.arrAutos[indexPath.row].Marca
                    cell.lblPrice.text = self.arrAutos[indexPath.row].Precio
                    cell.lblModel.text = self.arrAutos[indexPath.row].Modelo
                }

            } catch let parsingError {
                print("Error", parsingError)
            }
        }
        task.resume()

    return cell
}

JSON序列化工作正常,因为其他数据在表视图中正确显示,问题出在图像上,因为在表视图中只出现一张图像,其他行为空。有人有建议吗?


我认为您应该在加载表视图之前下载完整数据并在完成处理程序中重新加载表视图。称呼loadData()方法在你的viewDidLoad().

fileprivate func loadData() {

    let url = URL(string: "http://ws-smartit.divisionautomotriz.com/wsApiCasaTrust/api/autos")!

    let task = URLSession.shared.dataTask(with: url) {
        (data, response, error) in

        guard let dataResponse = data, error == nil else {
            print(error?.localizedDescription ?? "Response Error")
            return
        }

        do {
            let jsonResponse = try JSONSerialization.jsonObject(with: dataResponse, options: []) as? NSArray
            self.arrAutos = jsonResponse!.compactMap({ Autos($0 as? [String:String])})

            DispatchQueue.main.async {
                self.tableView.reloadData()
            }

        } catch let parsingError {
            print("Error", parsingError)
        }
    }
    task.resume()
}

要在 tableView 单元格中加载图像,请下载图像background线程,然后更新 imageView 中main thread.

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "carsCell", for: indexPath) as! CarsDetailTableViewCell

        // Get valid string
    let string = self.arrAutos[indexPath.row].RutaImagen
        //print(string)
    cell.lblBrand.text = self.arrAutos[indexPath.row].Marca
    cell.lblPrice.text = self.arrAutos[indexPath.row].Precio
    cell.lblModel.text = self.arrAutos[indexPath.row].Modelo
    let url = URL(string: string)
    if url != nil {
        DispatchQueue.global().async {
            let data = try? Data(contentsOf: url!)
            DispatchQueue.main.async {
                if data != nil {
                    cell.imgCar.image = UIImage(data:data!)
                }
            }
        }
    }
    return cell
}

希望这会起作用。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

我在表视图中显示 JSON 图像时遇到问题 的相关文章

随机推荐

  • Django:自动生成目录中的文件列表

    我在我的网站上使用图片库应用程序 目前 我将图像文件放在一个目录中 并手动为每个图像编写 img html 标签 是否可以让 django 自动在目录中创建文件列表 并将 json 输出发送到图库应用程序 以便我可以使 javascript
  • 如何在 Angular 拦截器内的请求正文中添加一些内容?

    在这里 我可以修改标题 因为有多个关于此功能的教程 但是 Injectable export class MyFirstInterceptor implements HttpInterceptor constructor private c
  • 离线时准确检测时间

    背景资料 我正在开发一个连接到服务器的 iOS 应用程序 可以从设备向服务器发出请求 以将本地数据库与服务器的数据库同步 更改可能发生在任一数据库上 该应用程序还具有离线功能 用户可以在不连接到互联网连接的情况下修改数据 只有在线才能通过发
  • 在怪癖模式下无法正常工作的所有内容的列表? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 有人有 Quirks 模式 特别是 IE Quirks 模式 中存在 bug 的 HTML JavaS
  • 用户提供的 MSSQL 数据库的 Pivotal/Django 设置

    我在 Pivotal Cloud Foundry 上部署了一个 django 应用程序 在开发过程中 我只是坚持使用内置的 sqlite 数据库 同时将 UI 组合在一起 不需要保留数据 因此推送 删除不是问题 此后 我在本地服务器 Azu
  • 使用相似性 Postgres 模糊自连接查询提高性能

    我正在尝试运行一个查询 该查询将表与自身连接起来 并进行模糊字符串比较 使用三元组比较 以查找可能的公司名称匹配 我的目标是返回一个记录的公司名称 ref name 字段 的三元相似度与另一记录的公司名称匹配的记录 目前 我将阈值设置为 0
  • PHP 按索引对二维数组进行排序(非关联)

    该代码无法正常运行 但它表明了我正在尝试做的事情 function sort 2d by index a i function cmp x y Nested function can t find i global i defeats th
  • putStrLn 不打印到控制台

    我正在尝试 wxHaskell 我无法在 ghci 下运行该应用程序 因此我必须使用应用程序来测试它 我想用 println 调试来测试程序 然而 putStrLn 似乎在 GUI 中不起作用 LANGUAGE Haskell2010 mo
  • 是否可以在角度 2+ 中进行条件内容投影(嵌入)

    我想提供仅在内容未被嵌入时才会出现的默认内容 例如 这是我的组件模板
  • 如何从 Z3 中的 Seq 类型中提取元素作为基本类型?

    如何将序列中的元素提取到基本类型 以便以下内容正常工作 define sort ISeq Seq Int define const x ISeq seq unit 5 define const y ISeq seq unit 6 asser
  • 标准输出重定向

    我正在使用 tcl 中的一个程序 我无法控制该程序 它在输出窗口上输出很多详细信息 例如 Response
  • 持久性实体的 GWT 反序列化 (JPA)

    我目前正在开发托管在 weblogic 应用程序服务器上的 Java GWT 应用程序 我使用 EJB3 0 和 EclipseLink 作为持久层 遗憾的是 我的 GWT 在反序列化持久实体时遇到问题 知道我可能会对你有所帮助 在我的类路
  • AutoMapper:如果源 == null,则创建目标类型的实例

    如果源对象为 null 是否可以将 AutoMapper 配置为返回目标类型的新实例 Source source null Dest d1 AutoMapper Mapper Map
  • Azure ServiceBus QueueClient.OnMessage 是否在不同的线程上执行

    QueueClient OnMessage 方法是否始终在不同线程上执行回调参数 我假设如果 MaxConcurrentCalls 设置为 10 那么queueClient 将最多启动 10 个线程来并行处理消息 如果传入 MaxConcu
  • .py 文件在浏览器中显示代码而不是运行

    我正在尝试开始使用 Python 但无法为 localhost 正确设置我的服务器 使用 Ampps Python 通过 IDLE 和命令行运行得很好 但是 当我在浏览器中打开文件时 代码会显示但不会运行 我跟着这个http www iml
  • 如何在 Azure 中选择 blob 块大小

    我想在 Azure 存储中使用追加 blob 当我上传 blob 时 我应该选择块大小 选择块大小时应该考虑什么 如果我上传的文件大小大于块大小 我看不出有什么区别 如何选择合适的块大小 根据你的描述 我做了一些研究 你可以参考它以更好地理
  • 运行 Hadoop 示例在伪分布式模式下停止

    在独立模式下一切都运行良好 当进入伪分布式模式时 HDFS 运行良好 我可以将文件放入 HDFS 并浏览它 我还检查了活动节点列表中是否有一个 DataNode 然而 当我跑步时bin hadoop jar hadoop examples
  • 如何更新控制中心的播放位置?

    这是我从指挥中心观察变化的方式 commandCenter playCommand addTarget self action selector play commandCenter pauseCommand addTarget self
  • 如何通过点击号码从 webviewclient 打开拨号器活动?

    我正在我的应用程序中实现网络视图 现在 当用户单击电话号码时 它会显示净 ERR UNKNOWN URL SCHEME 但如果我使用铬 它会带来带有该电话号码的拨号器应用程序 我的应用程序中需要完全相同的东西 当在 Web 视图中单击电话号
  • 我在表视图中显示 JSON 图像时遇到问题

    我正在尝试显示来自 API 的图像 这些图像位于 URL 内 我想用所有数组填充表视图 但它在表视图中只显示一张图像 这是我的代码 struct Autos let Marca String let Modelo String let Pr