快速了解UITableViewCell可重用性
总览
表格视图在单个列中显示项目列表。 UITableView是UIScrollView的子类,尽管UITableView仅允许垂直滚动,但它允许用户滚动表。 组成表格中各个项目的单元格是UITableViewCell对象; UITableView使用这些对象绘制表的可见行。
Tableview不会在每次调用行单元格时都初始化单元格,它会重用 em。 明显!! every♂️每个人都知道,但问题是“ 如何?” ”。
诸如TableView之类的Apple API使用称为“ 对象池 ”的东西来进行管理。
对象池
对象池是一种设计模式,它可以重复使用🔄一组预初始化的对象,或者可以说它维护了实际需要的对象池,然后又一次又一次地重复使用它。
Tableview充当池的客户端,当它请求对象时,池将从池中返回一个实际项目,该项目可重复使用,而不是每次都初始化一个新对象。 当客户端完成对象处理后,该对象将返回到池中以供重用。
对象池用于提高性能,因为没有创建或销毁对象,而是将它们从池中抽出并在使用后返回给对象,从而节省了更多时间和内存复杂性。
在TableView的情况下很容易理解。 创建单元时,它是从池中提取的,在完成其工作时,或者万一可以说,在TableView中完成显示将返回到池中。
对象池的实现:
让我们尝试为自己创建对象池。
让我们创建一个可用于约束通用池项的协议。
协议可重复使用{
函数重用()
}
我们可以在协议中添加重用函数,在该协议中,当元素从池中重用时,我们可以重置视图以重用它,并重设视图(reuse)。
类ResuableCell:UITableViewCell,可重用{
函数重用(){...}
}
现在我们可以建立对象池了。
Pool {
私有let maxElement:Int
私人让生产者:()-> T
public init(maxElementCount:Int,producer:@escaping()-> T){
自我生产者=工厂
self.maxElement = maxElementCount
}
}
- maxElement是我们要在池中进行初始化的元素的最大数量,就像我们在TableView中具有numberOfRows或numberOfSections一样。
- 生产者函数需要告诉我们如何制作通用元素
我们需要再添加两个绘制和释放功能,例如在TableView中,该单元格在屏幕上显示后将被释放。
Pool {
私有let maxElement:Int
私人让生产者:()-> T
私有变量池= [T]()
public init(maxElement:Int,producer:@escaping()-> T){
self.producer =生产者
self.maxElement = maxElement
}
公共功能draw()-> T {
保护self.pool.isEmpty,self.pool.count <self.maxElement else {
返回self.pool.removeFirst()
}
让元素= self.producer()
返回元素
}
公共功能发布(_元素:T){
element.reuse()
self.pool.append(元素)
}
}
当在TableViewDataSources的cellForRow函数中调用dequeueReusableCell函数时,我们只需从池中绘制即可。
func dequeueReusableCell(withIdentifier identifier:String)-> UITableViewCell {
返回objectPool.draw()
}
当单元格在屏幕上结束显示时,我们可以简单地将其释放回池中。
func handleDidEndDisplayingCell(_ cell:UITableViewCell,forRowAt indexPath:IndexPath){
proxy.tableView(_ tableView:自我,didEndDisplaying单元格:单元格,forRowAt indexPath:indexPath)
objectPool.release(cell)
}
因此,这是Apple TableView可重用性中使用的方法。