在CollectionViewcell中使用tableView的性能问题

时间:2016-06-20 11:46:56

标签: ios swift uitableview uicollectionview uicollectionviewcell

我有一个ViewController,它有一个集合视图。在每个集合视图单元格中,它们是一个tableview。我因为tableView而面临性能问题。我调用其cellofItemAtIndexPath时,尝试为每个CollectionViewCell重新加载数据。由于这个原因,我的CPU使用率上升了90%。我的ViewController看起来像这样

func numberOfSectionsInCollectionView(collectionView: UICollectionView) -> Int {
    return 1
}

func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
    return 10
}

func collectionView(collectionView: UICollectionView, didSelectItemAtIndexPath indexPath: NSIndexPath) {
}

func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {

        let cell = collectionView.dequeueReusableCellWithReuseIdentifier("MyCustomCollectionViewCell", forIndexPath: indexPath) as! MyCustomCollectionViewCell
        // This line is causing performance issue 
        cell.tableView.reloadData()
        return cell     

}

func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize {

    return CGSizeMake(40, 40)
}

MyCustomCollectionViewCell看起来像这样

class ChannelCollectionViewCell: UICollectionViewCell, UITableViewDelegate, UITableViewDataSource, UIScrollViewDelegate {


    @IBOutlet weak var tableView: UITableView!
    var delegate: ChannelCollectionViewCellDelegate?


    // MARK: - Table view data source
    func numberOfSectionsInTableView(tableView: UITableView) -> Int {

        return 10
    }

    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
       return 120
    }

    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
                let cell = tableView.dequeueReusableCellWithIdentifier("MyCustomTableViewCell", forIndexPath:
                    indexPath) as! MyCustomTableViewCell
                cell.title = "Testt Title"
                return cell
    }

    func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {

    }

    func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
        return 50
    }
}

可以将cell.tableView.reloadData()移动到更好的位置,这样就不会导致性能问题

1 个答案:

答案 0 :(得分:1)

我不这么认为,因为像UITableView这样UICollectoinView填充了dataSource,当你将另一个UICollectoinViewCell出列时,你必须调用reloadData()(因为这个单元格)可能之前已经初始化,你必须重新填充它。)

你可以做的是停止出队(自担风险)。 Dequeuing是一种内存优化技术,如果collectionView中只有10个单元格,您可以“直接”初始化UICollectionViewCell并显示它。但是collectionView仍然会调用cellForRowAtIndexPath,因此你必须为每个indexPaths缓存所有单元格,如果你已经初始化了单元格,则返回它。但是这种技术使用了大量内存,因此很可能会收到大量内存警告。

我猜你正在实现像Trello之类的东西(因为collectionView中的tableView哪个tableView包含大约120行对我来说听起来不合逻辑:/)。如果是这种情况,我建议您将架构更改为UIPageViewController + UITableViewContoller