Ios 如何创建包含复杂内容的UITableViewCells以保持流畅的滚动

Ios 如何创建包含复杂内容的UITableViewCells以保持流畅的滚动,ios,swift,uitableview,cocoa-touch,ios-charts,Ios,Swift,Uitableview,Cocoa Touch,Ios Charts,我正在从事一个项目,在这个项目中,我有一个表视图,其中包含许多具有相当复杂内容的单元格。通常不超过两个,但在例外情况下,比如说,最多30个。每个复杂单元都包含一个折线图。我正在为此使用ios图表() 这就是视图控制器的内容的外观: 我用于将viewController的CellForRowatineXpath方法中的单元格出列的代码如下所示: var cell = tableView.dequeueReusableCellWithIdentifier("PerfgraphCell", forI

我正在从事一个项目,在这个项目中,我有一个表视图,其中包含许多具有相当复杂内容的单元格。通常不超过两个,但在例外情况下,比如说,最多30个。每个复杂单元都包含一个折线图。我正在为此使用ios图表()

这就是视图控制器的内容的外观:

我用于将viewController的CellForRowatineXpath方法中的单元格出列的代码如下所示:

var cell = tableView.dequeueReusableCellWithIdentifier("PerfgraphCell", forIndexPath: indexPath) as? UITableViewCell
if cell == nil {
    let nib:Array = NSBundle.mainBundle().loadNibNamed("PerfgraphCell", owner: self, options: nil)
    cell = nib[0] as? FIBPerfgraphCell
}

cell.setupWithService(serviceObject, andPerfdataDatasourceId: indexPath.row - 1)
return cell!
在计算单元的代码中,我有一个方法“setupWithService”,它从一个已经存在的对象“serviceObject”中提取数据源,并初始化图形的绘制,如下所示:

func setupWithService(service: ServiceObjectWithDetails, andPerfdataDatasourceId id: Int) {

    let dataSource = service.perfdataDatasources[id]
    let metadata = service.perfdataMetadataForDatasource(dataSource)

    if metadata != nil {
        if let lineChartData = service.perfdataDatasourcesLineChartData[dataSource] {

            println("starting drawing for \(lineChartData.dataSets[0].yVals.count) values")

            chartView.data = lineChartData
        }
    }
}
现在的问题是:根据图表中要绘制的值的多少(在100到2000之间),绘图似乎变得相当复杂。用户注意到,当他向下滚动时:一旦一个包含如此复杂图表的单元格要退出队列,滚动就会被卡住一小会儿,直到图表被初始化。那当然很难看

在这种情况下,视图控制器接收到绘图所需的数据后,不按需将单元格出列,而是预定义它们并将它们保存在一个数组中,并在需要时将相应的单元格从该数组中拉出,这有意义吗?或者,是否有一种方法可以使图表的初始化异步,以便单元格立即出现,但图表在“准备就绪”时就会出现


谢谢你的回复

在这种或那种情况下,您试图做的事情不可避免地会遇到一些严重的性能问题。将所有单元(及其数据存储到内存中)存储将很快耗尽应用程序的可用内存。另一方面,退出队列和重新加载会在某些设备上产生延迟,正如您现在所经历的那样。您最好重新思考应用程序的体系结构,方法如下:

1-预计算图形并将其导出为图像。将图像加载到单元格中或从单元格中加载图像会大大降低性能

2-将表格视图设置为向下钻取菜单,在该菜单中一次只显示一个图形


希望这有帮助

谢谢。你的问题把我推向了正确的方向。我仍然不知道如何实现图表的绘制和保存到保存的图像中,但我可能会在这里问另一个问题。