iOS开发:UICollectionView的reloadData失效问题

Objective-C开发iOS App中的UICollectionView调用reloadData失效问题。

最近开发时遇到一个业务场景如下:

App的首页有一个直播课程入口卡片,卡片上会显示一个数据。点击卡片进入二级页面后,有一个操作会改变这个数据,并且会发一个通知,首页监听这个通知,收到通知后在回调里调用reloadData重新加载数据。遇到的问题是直接调用reloadData失效。打断点发现数据正常修改了,Cell也正常刷了,但是切会主页后卡片上的数据还是没有正常显示。

经过检查代码后发现,在cell的setModel方法中,为了避免重复赋值,先判断了一下待赋值的对象和传进来的对象是否是同一个对象,如果是的话直接return,就是这一步导致了cell中的label没有正确的刷新,因为二级页面修改的数据model和首页的model是同一个对象,所以在setModel中被直接return掉了。

此外,直接调用self.collectionView reloadData有时候也会失效,在我的代码里,这个可能是由于view的生命周期导致的,即view已经被绘制了才执行的reloadData。在其它情况中,也有可能是由于多线程竞争问题,导致数据被修改,reloadData失效。

尝试解决方式1:

手动把reloadData加入主队列,并且删除cell的setModel函数里的重复赋值的判断,即每次setModel都会根据传进来的model更新cell中各label的值:成功解决。

dispatch_async(dispatch_get_main_queue(), ^ {
    [self.collectionView reloadData];
});

reloadData只能在主线程执行,因为它是UI的更新,UI的相关操作一定是在主线程中的。在主线程把reloadData加入主队列的影响是,这个操作会被推迟到下一个RunLoop周期执行,并且排在第一个,这样就可以保证先reloadData之后,View才会被绘制,这样就是正确的数据。

尝试解决方式2:

使用强制刷新全部Item:也能解决问题。

[self.collectionView reloadItemsAtIndexPaths:[self.collectionView indexPathsForVisibleItems]];

这个也能生效。因为这个方法会先删除cell,再重新生成cell,走代理方法。因此,在原本的setModel中会跳过重复赋值的判断(因为此时的cell是新生成的,它的model是nil)。但是,如果本来的cell就为空,这个方法可能会有crash的风险。

推荐使用方式1解决,我也最终采用方案1.

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值