睡不着起来写一个小文章。。。
之前一直说重用重用,但是只知道怎么调用系统的API实现重用功能,但是当有人问重用机制到底是怎么实现的,整个人都懵逼了。
iOS 重用机制
- 可变数组,用来保存当前显示的cell
NSMutableArray *visiableCells
- 可变字典,用来保存可复用的cell
NSMutableDictionary *reusableTableCells
可复用的cell使用字典是因为可复用的可能cell不只有一种样式,这里需要字典指定key(也就是reuseIdentifier)来查找是否有可重用样式。
在这里先假设iPhone屏幕最多能显示10个cell
- 在这里先执行11次(最多能显示的次数+1)
[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault
reuseIdentifier:CellIdentifier]
// Or
[[[NSBundle mainBundle] loadNibNamed:@"XXTableViewCell"
owner:self options:nil] lastObject];
这个时候把能10个cell(当前屏幕最多显示的数据,这里假设是10)加入到visiableCells数组当中,第11个已经创建,但是加入到此数组。
此时的reusableTableCells为空
当我们拖动屏幕的时候,第1个cell移出屏幕顶端并加入reusableTableCells当中,并为其指定特定的reuseIdentifier。此时第11个cell(已经创建好)就加入到visiableCells数组当中。
接下来的拖动当中显示新的cell,cellForRowAtIndexPath会调用,这个时候就执行重用API:传入一个CellIdentifier
tableView dequeueReusableCellWithIdentifier:CellIdentifier
底端出现的cell:
reusableTableCells(取出)-> visiableCells(放入)
顶端消失的cell:
visiableCells(取出)-> reusableTableCells(放入)
注: visiableCells当中如果没有的该标识符话,alloc即可
- 并不是只有超过屏幕的时候才更新reusableTableCells数组,reloadData方法 和 reloadRowsAtIndex(可能) 对数组进行更新
请选择数据结构去实现上述重用机制?