UITableView reloadData阻止每秒有许多更新的UI

时间:2014-10-01 19:17:47

标签: ios objective-c iphone uitableview

我有一个能够下载某些文件的应用程序。这些文件显示在UITableView中,点按后会开始下载。

我想在单元格中显示下载的进度(例如,以百分比表示)。我的代码当前会在更新下载进度时触发通知。

问题是这些进度更新每秒触发多次(数百?)次。如果我使用[tableView reloadData],甚至是[tableView reloadRowsAtIndexPaths:...],那么下载开始后,用户界面就会像疯了一样,因为这种情况经常被调用。

除此之外,我的代码非常小。我没有使用任何不常见的UITableView委托方法,除了更新“下载”之外,我还试图消除其他所有方法。 cellForRowAtIndexPath:中的标签 - 但它仍然滞后很多!

我有什么选择?我可能会创建一个计时器,每隔一秒左右更新一次UI,以显示下载进度,但这看起来很糟糕。用户界面可以更好!是否有 任何 方式,我可以立即更新下载标签,而不会延迟我的用户界面?

2 个答案:

答案 0 :(得分:2)

听起来你需要减慢通知流量。

假设进度介于0和1之间,则在触发通知的方法中,使用类似于:

的内容
if (floorf(progress*100) == progress*100) {
  // send notification
}

如果进度为1%,2%等,则只会发送通知以刷新单元格

此外,在UITableView中,尝试仅重新加载可见单元格:

if ([[self.tableView indexPathsForVisibleRows] containsObject:indexPath]) {
  [self.tableView reloadRowsAtIndexPath:@[ indexPath ]];
}

答案 1 :(得分:0)

我会使用performSelector:withObject:afterDelay方法,它看起来像这样

[self performSelector:@selector(updateCell:) withObject:cell afterDelay:0.5];

updateCell方法看起来像这样

- (void)updateCell:(CustomUITableViewCell *)cell {
    [cell setNeedsLayout];
    if (cell && cell.downloadPercentage < 100) {
        [self updateCell:cell];
    }
}

这样做是每1/2秒调用一次updateCell方法,直到下载完成。它调用[cell setNeedsLayout](或者你可以调用你想要更新你的单元格显示的任何方法来更新百分比条,比如[cell setNeedsDisplay]或[cell updateDownloadLabel])来更新单元格,然后再次调用updateCell 。

你可以玩延迟来看它,感受你想要的和平衡性能。

在单元格滚动离开屏幕后调用此问题可能会出现问题,因此请务必检查单元格是否仍然存在