包含所有具有自己的进度视图的单元格的表格非常慢

时间:2016-03-10 17:01:09

标签: ios swift uitableview alamofire uiprogressview

我有一个表格,显示有关正在下载的对象列表的信息。每个单元格包含一个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()
}

但是我发现这导致一切都变慢了。

非常感谢任何建议,提前谢谢!

2 个答案:

答案 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秒或更短时间更新一次性能。但不是每次进展都会变得太频繁。