我有一个表格,显示有关正在下载的对象列表的信息。每个单元格包含一个date
,根据下载的进度进行更新。我的问题是,在下载和更新此进度视图期间,一切都非常慢,并且在Xcode的调试导航器中以100%或更高的速度监视CPU。
每个对象都存储有自己的progress属性。
UIProgressView
我有一系列的这些:
class Download {
var id: String = ""
var progress: Float = 0
}
使用var downloads = [Download]()
使用以下内容设置我的视图控制器中的tableView
:
cellForRowAtIndexPath:
我正在使用let download = downloads[indexPath.row]
cell.progressView.progress = download.progress
管理我的下载并使用包含的进度结束,我正在更新下载的进度:
Alamofire
正是在这一点上,我认为由于发生了大量更新,瓶颈正在发生。为了尝试限制问题,我尝试只更新单个单元格,因为它已被更改:
download.progress = Float(bytesRead) / Float(bytesExpected)
dispatch_async(dispatch_get_main_queue()) {
self.tableView.reloadData()
}
但是我发现这导致一切都变慢了。
非常感谢任何建议,提前谢谢!
答案 0 :(得分:3)
每秒可以多次触发上传进度块,并且重新加载整个表视图是昂贵且低效的。您应该做的是分别监视每个表视图单元格中的上载进度。这是你如何做到的。 在你的tableviewcell中:
var progressTimer: NSTimer?
var download: Download? {
didSet {
guard let download = download else {
// cancel your timer here
return
}
// start NSTimer here to update UIProgressView every second
}
}
func prepareForReuse() {
super.prepareForReuse()
download = nil
}
在视图控制器中:
override func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell,
forRowAtIndexPath indexPath: NSIndexPath) {
cell.download = downloads[indexPath.row]
}
答案 1 :(得分:0)
您正在尝试在进度更新时重新加载表格或单元格,这很重。
由于已创建progressViews,尝试重用它们,您可以使用Tag获取progressView实例:
let rowIndex = self.downloads.indexOf() { $0.id == download.id }
let indexPath = NSIndexPath(forRow: rowIndex, inSection: 0)
let cell = tableView.cellForRowAtIndexPath(indexPath)
let progressView = cell?.viewWithTag(100) // Tag your progressView as 100
progressView.progress = download.progress
更进一步,只要用户感觉顺利进行,您也可以每0.5秒或更短时间更新一次性能。但不是每次进展都会变得太频繁。