我应该如何正确管理 JSON 提供的图像

Posted

技术标签:

【中文标题】我应该如何正确管理 JSON 提供的图像【英文标题】:How should I manage correctly images provided by JSON 【发布时间】:2018-07-17 21:10:56 【问题描述】:

我正在尝试解析我的应用程序上下载的 JSON 提供的所有图像。所以,我听说过很多方法可以正确地做到这一点。我应该使用哪个 API 来管理我的应用程序上的图像?我该怎么做,我可以举个例子吗?

我还想正确处理以下之间的延迟:

运行应用 --> 加载数据 --> 填充 UI 元素

我应该怎么做才能最大限度地减少这种延迟,我认为专业的应用程序不应该花那么长时间来加载所有组件。

这就是我将用图像填充 UITableView 的部分。

var arrCerveja = [Cerveja]()

class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource 
    @IBOutlet weak var tableView: UITableView!

    //TableView DataSource
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
        return arrCerveja.count
    

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
        let cell = tableView.dequeueReusableCell(withIdentifier: "cellID") as! TableViewCell

        let model = arrCerveja[indexPath.row]

            cell.labelName.text = model.name
            cell.labelDetail.text = "\(model.abv)"
            cell. imageViewCell.image = ???? //How should I do that? 
        return cell
    
    //TableView Delegate
    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) 

    



    override func viewDidLoad() 
        super.viewDidLoad()
        getApiData  (cerveja) in
           arrCerveja = cerveja
           self.tableView.reloadData()
        

    

模型文件夹:

import Foundation
struct Cerveja:Decodable
    let name:String
    let abv:Double
    let image_url:String

网络文件夹:

import Alamofire


func getApiData(completion: @escaping ([Cerveja]) -> ())
    guard let urlString = URL(string: "https://api.punkapi.com/v2/beers") else 
        print("URL Error")
        return
    
    Alamofire.request(urlString).responseJSON  response in

        if response.data == response.data
            do
                let decoder = try JSONDecoder().decode([Cerveja].self, from: response.data!)

                completion(decoder)
            catch
        print(error)
            
        elseprint("API Response is Empty")

        

【问题讨论】:

【参考方案1】:

你可以做的是缓存下载的图像,有很多库可以帮助你做到这一点,这里是其中的一些列表:

Kingfisher HanekeSwift Cache

Kingfisher 是一款不错的工具,它还允许您下载图像并解释如何使用带有表格视图的库。 缓存图像也将减少应用程序下次打开时的加载时间。 您还可以使用this library 在加载过程中向用户显示用户友好的加载。

【讨论】:

您好,感谢您帮助我! AlamofireImage 和 SDWebImage 也不错吗? 没问题,我从未使用过 AlamofireImage 或 SDWebImage,所以我不想对它们发表意见,但似乎 AlamofireImage 会帮助您下载图像但不会缓存它们(因此在下一次发射)。 SDWebImage 看起来与 Kingfisher 非常相似,也非常强大。它应该可以为您简化图像的下载和缓存。我只能建议您对两者进行更多研究,然后选择更适合您的项目的一个。

以上是关于我应该如何正确管理 JSON 提供的图像的主要内容,如果未能解决你的问题,请参考以下文章

除了启动图像和应用程序图标之外,我可以使用资产目录来管理图像吗?

如何正确管理 websocket 消息?

直接从Android文件管理器打开html页面时如何正确设置背景图像的绝对路径

在我尝试设置配置文件管理时如何正确使用提供程序?

如何使用 canny 管理图像比较中的 MIN_MATCH_COUNT?

如何通过任何文件资源管理器更改图像背景