Swift Json Tableview迟滞

时间:2018-04-07 16:00:14

标签: ios json swift uitableview

我有问题。我在Swift中有这个代码,但是当我在tableview中滚动它非常滞后,我不知道问题是什么.. ?? 它下载的图像数据每个都是20mb(我认为)..

谢谢!

func downloadJsonWithTask() {

    let url = NSURL(string: urlString)

    var downloadTask = URLRequest(url: (url as? URL)!, cachePolicy: URLRequest.CachePolicy.reloadIgnoringCacheData, timeoutInterval: 200)

    downloadTask.httpMethod = "GET"

    URLSession.shared.dataTask(with: downloadTask, completionHandler: {(data, response, error) -> Void in

        let jsonData = try? JSONSerialization.jsonObject(with: data!, options: .allowFragments)

        print(jsonData)

    }).resume()
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "cell") as! TableViewCell
    cell.nameLabel.text = nameArray[indexPath.row]
    cell.dobLabel.text = dobArray[indexPath.row]

    let imgURL = NSURL(string: imgURLArray[indexPath.row])

    if imgURL != nil {
        let data = NSData(contentsOf: (imgURL as? URL)!)
        cell.imgView.image = UIImage(data: data as! Data)
    }

    return cell
}

///for showing next detailed screen with the downloaded info
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {

    let vc = self.storyboard?.instantiateViewController(withIdentifier: "DetailViewController") as! DetailViewController
    vc.imageString = imgURLArray[indexPath.row]
    vc.imageString2 = imgURL2Array[indexPath.row]
    vc.imageString3 = imgURL3Array[indexPath.row]
    vc.imageString4 = imgURL4Array[indexPath.row]
    vc.imageString5 = imgURL5Array[indexPath.row]
    vc.imageString6 = imgURL6Array[indexPath.row]
    vc.nameString = nameArray[indexPath.row]
    vc.dobString = dobArray[indexPath.row]
    vc.txtString = txtArray[indexPath.row]
    vc.contactString = contactArray[indexPath.row]

    self.navigationController?.pushViewController(vc, animated: true)
}

3 个答案:

答案 0 :(得分:1)

由于这条线的问题

 let data = NSData(contentsOf: (imgURL as? URL)!)

它会阻塞主线程,你必须在其他队列中运行它,然后每次滚动都会重新下载图像(没有缓存)所以最好使用SDWebImage

cell.imgView.sd_setImage(with: URL(string: "http://www.example.com/path/to/image.jpg"), placeholderImage: UIImage(named: "placeholder.png"))

答案 1 :(得分:0)

这总是会滞后。 您在主线程中的请求图像。

尝试使用SDWebCache库:https://github.com/rs/SDWebImage

1:它将高速显示图像并避免多个HTTP请求。

2:在后台工作,所以不会影响主线程。

使用方法imageview.sd_imageFromUrl(URL(....)!)

答案 2 :(得分:0)

非常清楚。您从主线程询问图像数据。每当你在主线程上执行耗时操作时,应用程序就会变得迟钝。

let data = NSData(contentsOf: (imgURL as? URL)!)

迄今为止对我有用的最佳解决方案是使用AlamofireImage或Kingfisher。这需要您了解如何将库添加到项目中。尝试使用Cocoapods以方便使用。

我假设您可以在这里使用Cocoapods。

如果您想要缓存支持,Kingfisher是第一位的。缓存意味着您只需要第一次向服务器发出请求或者更改某些内容。它将节省您的资源等。您需要做的就是在ViewController中导入Kingfisher模块,然后使用Kingfisher扩展kf

自动扩展UIImageView功能

以下是示例代码

//ViewController.swift
import Kingfisher

// Your cellForRowAt
...
if let url = URL(string: imgURLArray[indexPath.row]) {
    cell.imgView.kf.setImage(with: url)
}
...

Kingfisher将在引擎盖下执行缓存策略,以便您可以专注于应用程序。

为了放置非常有用的默认图像来告知用户图像,(用户期望空白框中有东西 - UIImageView,而图像为零 - 在他们的屏幕中不是?)翠鸟帮助你placeholder

let defaultImage = UIImage(named: "default_img")!
cell.imgView.kf.setImage(with: url, placeholder: defaultImage)

在此Kingfisher's Github Page

了解有关翠鸟的全部见解