滚动多个单元格类型时,UITableView滞后

时间:2018-01-18 14:50:31

标签: ios swift uitableview mapbox uber-api

我知道有很多关于这个话题的问题,但请耐心等待,因为我没有找到解决我特定问题的方法。

首先,我的整个应用程序都在代码中(没有故事板)。我正在创建一个tableView(我从后端获取数据),具有多个单元格类型。单元格是恒定的,意味着第一个单元格将始终与任何其他第一个单元格相同(不确定是否得到我的观点,但从技术上讲,单元格类型对于特定的indexPath是不变的。

所以问题是我有方法使每个indexPath的特定单元格出列。在我的一个单元格中,我有一个MapboxStatic地图,它从Mapbox的服务器返回一张地图的图像。让我们说在初始运行时单元格不在屏幕上,如果我滚动得足够快,tableView将暂停一秒左右来加载返回的图像(我试着在主队列上异步加载它仍然带有没有变化)。

现在我的另一个问题是使用UberRides按钮,滚动时也会滞后(同样的问题)。

值得一提的是,如果我滚动tableView一次(有滞后),我向上滚动并向下滚动它不再滞后但我猜它是因为出列的单元格仍然是在记忆中。

如果您需要任何其他详细信息,请发表评论。

[编辑]代码:

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    if indexPath.section == 1 {
        return reserveTableViewCell(at: indexPath)
    } else if indexPath.section == 2 {
        return dateTimeTableViewCell(at: indexPath)
    } else if indexPath.section == 3 {
        return descriptionTableViewCell(at: indexPath)
    } else if indexPath.section == 4 {
        if indexPath.row == 0 {
            return mapTableViewCell(at: indexPath)
        } else {
            return uberTableViewCell(at: indexPath)
        }
    } else {
        let cell = tableView.dequeueReusableCell(withIdentifier: defaultCell, for: indexPath)
        return cell
    }
}

private func reserveTableViewCell(at indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: reserveCell, for: indexPath) as! ReserveTableViewCell
    return cell
}

private func descriptionTableViewCell(at indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: descriptionCell, for: indexPath) as! DescriptionTableViewCell
    return cell
}

private func dateTimeTableViewCell(at indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: dateTimeCell, for: indexPath) as! DateTimeTableViewCell
    return cell
}

private func mapTableViewCell(at indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: mapCell) as! MapTableViewCell
    cell.detailController = self
    return cell
}

private func uberTableViewCell(at indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: uberCell, for: indexPath) as! UberTableViewCell
    return cell
}

最佳

2 个答案:

答案 0 :(得分:1)

好吧,创建你的细胞很慢。现在知道什么需要这么多时间,很难给你任何建议。使用time profiler确定有问题的代码。

答案 1 :(得分:1)

如果您不需要叠加层,可以尝试使用MGLMapSnapshotterHere是如何将MGLMapSnapshot与表视图一起使用的示例。