UITableViewCell/UICollectionViewCell 的上下文

Posted

技术标签:

【中文标题】UITableViewCell/UICollectionViewCell 的上下文【英文标题】:Context for UITableViewCell/UICollectionViewCell 【发布时间】:2016-05-11 08:10:08 【问题描述】:

这个问题可能看起来与其他问题相似,但我认为不是。

直截了当……

将不透明上下文对象 (void * / id / AnyObject) 设置为 UITableViewCell/UICollectionViewCell 子类对您来说是最佳做法吗?

为什么要问这个问题? ...您可能知道 UITableView / UICollectionView 是以异步方式构建的,这让我认为这是避免崩溃或错误数据使用的好方法。

让我解释一下。 可能大多数 ios 开发人员至少遇到过一次需要使用委托对象对 UITableViewCell 进行子类化,该委托对象用于传递单元格以对单元格本身的某些交互做出反应。

这样做,委托(ViewController)可能会搜索单元格的索引路径以发现相关的数据对象并对数据进行一些处理。好的,但是很多时候,由于远程数据更新,在重新加载 tableView 后,委托消息被传递,但作为异步过程,旧单元格仍在屏幕上...

在最坏的情况下你会崩溃,在最好的情况下你会操作错误的数据对象。

因此,如前所述,解决此问题的方法可能是单元子类携带的不透明对象(上下文),单元代表可以使用该对象(上下文)从发送给委托消息的单元中获取上下文。 显然由于重用单元类必须在prepareForReuse期间清理上下文。

通过这种方式,TableViewCell 对模型一无所知,但它将充当委托的邮递员。

你怎么看?

【问题讨论】:

【参考方案1】:

但很多时候,由于远程数据更新,在 tableView 重新加载后传递委托消息,但作为异步进程,旧单元格仍在屏幕上

如果出现以下情况,您不应该遇到此问题:

您的委托消息在主队列上同步发送。 您在主队列上同步处理模型和表视图更新。

如果您在模型更新和表格 UI 重新加载之间有一些延迟,您会遇到很多问题,而不仅仅是您描述的问题。

基本上,我更喜欢您详述的查找索引路径等的方法,而不是添加到单元格的上下文对象。

【讨论】:

当然,发送给委托的消息是在主线程上同步发送的。我所描述的只有在远程更新 TableView 时才能看到……让我们考虑一下真正的实时更新。 一旦 TableView 重新加载,并非所有数据源消息都在同一个运行循环中发送。这就是构建框架的方式。由于这个原因,可能会发生 reloadData,并且在当前但旧的单元格上的用户交互由框架在 reloadData 之后发送。它的发生不是因为错误,而是因为框架以这种方式工作。

以上是关于UITableViewCell/UICollectionViewCell 的上下文的主要内容,如果未能解决你的问题,请参考以下文章