同时在多个 UICollectionView 上调用 reloadData

Posted

技术标签:

【中文标题】同时在多个 UICollectionView 上调用 reloadData【英文标题】:Call reloadData on multiple UICollectionView at the same time 【发布时间】:2014-05-27 05:33:00 【问题描述】:

我有一个带有单视图控制器的示例应用程序。控制器的视图有子视图,如下所示

UIView
    UIScrollView -- (Frame = 0, 0, 320, 480)
        UICollectionView -- (firstCollectionView, Tag = 0, Frame = 0, 0, 320, 480)
        UICollectionView -- (secondCollectionView, Tag = 1, Frame = 480, 0, 320, 480)
        UICollectionView -- (thirdCollectionView, Tag = 2, Frame = 960, 0, 320, 480)

然后,我在 viewDidload 中调用

[self.firstCollectionView reloadData]; // Tag = 0
[self.secondCollectionView reloadData]; // Tag = 1
[self.thirdCollectionView reloadData]; // Tag = 2

而在delegate方法中,numberOfSectionsInCollectionView:,我放NSLog看哪个collectionView先开始重新加载它的数据

- (NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView 
    NSLog(@"Tag : %i", collectionView.tag);

令人惊讶的是,我得到了这个结果

2014-05-27 12:20:22.462 SampleApp[60652:60b] Tag : 2
2014-05-27 12:20:22.462 SampleApp[60652:60b] Tag : 1
2014-05-27 12:20:22.462 SampleApp[60652:60b] Tag : 0

每次我尝试,结果都会是这样 (2 -> 1 ->0) 你知道为什么结果(日志)是相反的吗?跟线程有关系吗?

最好的

附:我无法分享实际代码,但是,这是与 UICollectionView 问题相关的所有内容。我只是调用了控制器 viewDidLoad 中单个 UIScrollView 中包含的多个 UICollectionView 的 reloadData,发现了这个奇怪的结果。

【问题讨论】:

【参考方案1】:

一旦进行了重新加载调用,重新加载调用就会在单独的线程中运行。不保证线程按顺序运行。该框架将根据需要询问数据。如果集合视图不在可见框架中,则根本不会触发委托回调。

如果您正在考虑按顺序重新加载数据,有一些特定的方法可以实现它。请查看wait till UITableView finish reloadData 和Get notified when UITableView has finished asking for data?。您也可以将其扩展为集合视图。

【讨论】:

感谢您的信息,“重新加载在单独的线程中运行”。它让我的画面更清晰:) 一个问题,如果不能保证线程会按顺序运行,为什么我每次尝试都得到相同的序列(2 -> 1 -> 0)。为什么没有其他序列(1 --> 2 --> 0, 0 --> 2 --> 1 and else) 我不确定为什么序列总是2-->1-->0。随机猜测是 reload 调用 mitt 会堆积起来,直到消息执行完成。如果您更改重新加载的顺序,是否有任何变化?比如在 3 上调用 reload,然后是 2,然后是 1 或任何其他组合。 我稍后再试,告诉你。 嘿,@NaveenPrasadR。 框架会根据需要询问数据是什么意思。如果集合视图不在可见框架中,则根本不会触发委托回调。当它不可见时它不会重新加载?

以上是关于同时在多个 UICollectionView 上调用 reloadData的主要内容,如果未能解决你的问题,请参考以下文章

UICollectionView多个单元格(UICollectionViewCell)在Objective-C中闪烁同步

同时滚动和捏合多个 UiScrollView

觉莱斯证券(香港)有限公司:多省份上调最低工资

在布局更改的同时重新加载/动画 UICollectionView

我试图在我的 ViewController 上放置多个 UICollectionView,但模拟中只有一个 UICollectionView 正在运行

UICollectionView 点击选择多个单元格