快速了解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可重用性中使用的方法。

Interesting Posts