Cell的重用机制

  在iOS开发中,cell有重用机制可以减少不必要的内存开销,对应于tableViewCell的dequeueReusableCellWithIdentifier方法,和collectionViewCell的dequeueReusableCellWithReuseIdentifier方法。重用机制更多内容不在这里做介绍。
  
  

我遇到的问题

  
  做实习项目时遇到的,现在有一个关注人列表,类似微博里那种,我在follow或者unfollow一个人的时候,会给网络发一个请求来刷新服务器数据,这段时间转一了一个菊花,我遇到的bug表现如下图所示
  
  
    从图中可以看出,前两个button表现正常,第四个button点的时候菊花转在了第二个cell处,第三个button点击时在第一个cell那里闪了一下,应该是转了只不过这次网络请求callback太快没有看到,它的问题和第四个button一样。经过我多次测试发现,每一次第一次点击button的时候菊花都不会转错,但是从点击第二个button开始菊花位置就不能保证了。这个地方很奇怪,经验告诉我应该是重用机制造成的问题,但是我没有滚屏,按理说不应该进入到重用队列。

  随后我又在网上搜了一下重用机制,看到一个我之前不知道的:reloadData之后屏幕上的cell都进入重用队列,再重新重用。

  我进一步测试发现,如果每次点完按钮,再多等几秒钟,就不会出现菊花错位的问题,于是我找到了问题所在,我在第一个网络请求callback之后,又发了第二个网络请求,而那个请求的callback会刷新这个collectionView,即调用这个collectionView的reloadData方法,而我之所以要添加第二个网络请求,是为了修复另一个bug ,:-)。如果你想知道为什么reloadData之后菊花还会转,那是因为我加了一个标记。

  现在原因明确了,我点击第X的button时,第X-1个button发送的第二个网络请求还没有callback,等到它callback时刷新了collectionView,cell重用了,于是菊花跑偏了。所以等一段时间再点button不会出现这个问题,这段时间刚好是前一个button第二个网络请求callback回来。所以第一个button点的时候从来没有问题。

  经此一役,我加深了对cell重用机制的了解和理解。希望这篇文章对你也能有帮助:-)