我有一个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()移动到更好的位置,这样就不会导致性能问题
答案 0 :(得分:1)
我不这么认为,因为像UITableView
这样UICollectoinView
填充了dataSource,当你将另一个UICollectoinViewCell
出列时,你必须调用reloadData()
(因为这个单元格)可能之前已经初始化,你必须重新填充它。)
你可以做的是停止出队(自担风险)。 Dequeuing是一种内存优化技术,如果collectionView中只有10个单元格,您可以“直接”初始化UICollectionViewCell
并显示它。但是collectionView仍然会调用cellForRowAtIndexPath
,因此你必须为每个indexPaths缓存所有单元格,如果你已经初始化了单元格,则返回它。但是这种技术使用了大量内存,因此很可能会收到大量内存警告。
我猜你正在实现像Trello之类的东西(因为collectionView中的tableView哪个tableView包含大约120行对我来说听起来不合逻辑:/)。如果是这种情况,我建议您将架构更改为UIPageViewController
+ UITableViewContoller
。