我有问题。我在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)
}
答案 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
以下是示例代码
//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)
了解有关翠鸟的全部见解