使用 Json 图像 URL 调用 swift 填充 UITableView

Posted

技术标签:

【中文标题】使用 Json 图像 URL 调用 swift 填充 UITableView【英文标题】:populate UITableView with Json image URL calls swift 【发布时间】:2015-10-28 16:33:59 【问题描述】:

我是 Swift 编程新手,到目前为止,我正在将 Json 数据下载为字符串并填充 UITableView。里面的图片是网址链接。问题是数据很多,有 53 个,所以也需要 53 个 url 调用来获取图像。起初,我在主线程中做所有事情,所以它滞后了很多。现在,我将执行 http 调用的代码放在异步方法中。该应用程序不会滞后,但

1) 图片没有按顺序下载(我不介意那么多,虽然这样会更好)

2) 下载速度慢,内存在 250-270mb 左右,cpu 在 40-50% 左右,而网络在 500kb/s 左右。

我没有 iPhone 来进行实际检查,但根据这些数字,我发现该应用程序使用了大量资源。我想知道为什么网络这么慢。用3g-4g我觉得应该更快更省力,不知道模拟器用的是什么。

所以我的问题是,有什么方法可以让我的应用程序运行得更快或使用更少的资源?

在将数据放在 TableView 上的代码下方。用字符串填充表格需要不到 2 秒的时间,下载所有图像需要大量时间。

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell 

    let cellIdentifier = "GameTableViewCell"
    let cell = tableView.dequeueReusableCellWithIdentifier(cellIdentifier, forIndexPath: indexPath) as! GameTableViewCell
    let qualityOfServiceClass = QOS_CLASS_BACKGROUND
    let backgroundQueue = dispatch_get_global_queue(qualityOfServiceClass, 0)

    cell.nameLabel?.text = games[indexPath.row].name
    cell.releaseDateLabel?.text = games[indexPath.row].releaseDate

    dispatch_async(backgroundQueue, 
        for _ in self.games
            if let url = NSURL(string: self.games[indexPath.row].gameImage!) 
                if let data = NSData(contentsOfURL: url)
                    cell.photoImageView?.contentMode = UIViewContentMode.ScaleAspectFit
                    cell.photoImageView?.image = UIImage(data: data)
                
            
        
    )
    return cell

【问题讨论】:

【参考方案1】:

每次要显示单元格时,您都在下载图像。您需要使用NSCache 或任何其他第三方解决方案或像NSMutableDictionary 这样简单的东西来缓存下载成功的图像,这样您就不会每次都下载它们。

您还可以使用现有的第三方解决方案,如AlamofireImage 和SDWebImage,它们提供图像的异步下载、显示占位符图像和缓存

【讨论】:

我会尝试我的方式,如果我不能,我会添加第三方库,感谢您的信息。【参考方案2】:

我对此持怀疑态度,因为我从未使用过外部库,而是删除了 5-10 行代码来输入下面的代码。嗯,这样可以节省很多时间和麻烦。

 if let url = NSURL(string: self.games[indexPath.row].gameImage!) 
        cell.photoImageView?.hnk_setImageFromURL(url)
    

【讨论】:

以上是关于使用 Json 图像 URL 调用 swift 填充 UITableView的主要内容,如果未能解决你的问题,请参考以下文章

从 alamofire swift 的 tableview 单元格中的 url 加载图像

JSON解码器Swift 4.0

Swift:使用 UIImageView 显示带有从数组 [0..4] 中获取的 URL 的图像

JSON图像解析IOS Swift 3.0

Swift 3 中的 JSON 图像和核心数据 [关闭]

使用 Swift 3 和 Alamofire 在 JSON url 中的应用程序中没有显示任何内容