解决方法1:
dispatch_async(dispatch_get_main_queue(), ^ {
[self.collectionView reloadData];
});
解决方法2:
[self.collectionView reloadItemsAtIndexPaths:[self.collectionView indexPathsForVisibleItems]];
[self.collectionView reloadData];
解决方法3:
UIView *aView = [UIView new];
[collectionView addSubView:aView];
原因浅析:
解决方法3是迫使collection view发生改变,适用于有些可视区域没有发生改变没从而导致失败的问题。
解决方法2是强制重新加载。
深度解析就要看方法1:
本来所有的UI更新都是在主线程,强制一个UI更新在主线程似乎是没有意义的。
那这行代码究竟改变了什么。
这行代码会让闭包中的内容强行插入队列,优先于其它代码执行。
事实上reloadData()没有起作用的原因其实是一个race condition或者view事件的生命周期问题。race condition是多线程资源竞争,几个线程同时访问了一个资源。
reloadData()在viewWillAppear之后才被轮到执行,也就是说重新加载的目的是没有达到的因此这其实应该是一个接口设计的失误。方法2,方法3都是在改变reloadData()的执行顺序。