使用 Alamofire 加载图像非常慢

Posted

技术标签:

【中文标题】使用 Alamofire 加载图像非常慢【英文标题】:Loading images very slow using Alamofire 【发布时间】:2021-01-10 18:17:18 【问题描述】:

我正在从我的网站获取 JSON 数据到带有图像视图的表格视图。数据加载速度很快,只是图像加载速度很慢并且导致 tableview 没有响应。

这是我的cellForRowAt 代码:

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
    let customCell = tableView.dequeueReusableCell(withIdentifier: TableViewCell.identifier, for: indexPath) as! TableViewCell
    //let cell = tableView.dequeueReusableCell(withIdentifier: "myCell", for: indexPath)
    let item = data[indexPath.row]
    customCell.AdTitle?.text = item["title"].string
    customCell.AdDate?.text = item["time"].string
    
    if let imageUrl = item["document"].string 
        AF.request("https://mysite.co/uploads/" + imageUrl).responseImage  response in
            if case .success( _) = response.result 
                let url = NSURL(string:("https://mysite.co/uploads/" + imageUrl))
                let imagedata = NSData.init(contentsOf: url! as URL)
                
                if imagedata != nil 
                    customCell.AdImage.image = UIImage(data:imagedata! as Data)
                
            
        
    
    
    return customCell

【问题讨论】:

【参考方案1】:

您可以通过SDWebImage 使用高级缓存系统简单地加载您的图像,如下所示:

let imageURL = URL(string: "youRemoteImageURL") //Image URL     
yourImageView.sd_setImage(with: imageURL, placeholderImage: UIImage(named: "placeholder.png"))

您的 tableViewCell 将如下所示:

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
   let customCell = tableView.dequeueReusableCell(withIdentifier: TableViewCell.identifier, for: indexPath) as! TableViewCell

   let item = data[indexPath.row]
   customCell.AdTitle?.text = item["title"].string
   customCell.AdDate?.text = item["time"].string
   
   let imageUrl = item["document"].string
   let url = NSURL(string:("https://mysite.co/uploads/" + imageUrl))
   customCell.AdImage.sd_setImage(with: url, placeholderImage: UIImage(named: "placeholder.png"))

   return customCell

【讨论】:

【参考方案2】:

您的代码很好。您必须在主线程中加载图像。编辑后的代码如下。请尝试并告诉我

 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
    let customCell = tableView.dequeueReusableCell(withIdentifier: TableViewCell.identifier, for: indexPath) as! TableViewCell
    //let cell = tableView.dequeueReusableCell(withIdentifier: "myCell", for: indexPath)
    let item = data[indexPath.row]
    customCell.AdTitle?.text = item["title"].string
    customCell.AdDate?.text = item["time"].string
    
    if let imageUrl = item["document"].string 
        AF.request("https://mysite.co/uploads/" + imageUrl).responseImage  response in
            if case .success( _) = response.result 
                let url = NSURL(string:("https://mysite.co/uploads/" + imageUrl))
                let imagedata = NSData.init(contentsOf: url! as URL)
                
                if imagedata != nil 
                    DispatchQueue.main.async 
                        customCell.AdImage.image = UIImage(data:imagedata! as Data)
                    
                   
                
            
        
    
    
    return customCell

【讨论】:

以上是关于使用 Alamofire 加载图像非常慢的主要内容,如果未能解决你的问题,请参考以下文章

在 swift 3 中下载文件时,alamo fire 中的进度视图不会更新

将 alamofire json 响应转换为变量

从 PHAsset 加载图像非常慢

Glide 是不是对每个图像请求进行排队?滚动时Recyclerview加载非常慢

图像加载表非常慢[重复]

带有 json 的 ipad、平板电脑和手机的图像加载速度非常慢?