Ios UICollectionView呈现和活动指示器

Ios UICollectionView呈现和活动指示器,ios,uicollectionview,uiactivityindicatorview,Ios,Uicollectionview,Uiactivityindicatorview,我从UIViewController加载了UIView。此UIView包含一个(大)UICollectionView。 从第一个ui视图到第二个ui视图的转换非常缓慢:似乎在完成所有集合单元格的渲染后,可以显示第二个视图。 在第二个ui视图中,我尝试了 - (void)viewDidAppear:(BOOL)animated { [activityView stopAnimating]; NSLog(@"did appear %@",[NSDate date]); } - (vo

我从
UIViewController
加载了
UIView
。此
UIView
包含一个(大)
UICollectionView
。 从第一个
ui视图
到第二个
ui视图
的转换非常缓慢:似乎在完成所有集合单元格的渲染后,可以显示第二个视图。 在第二个
ui视图中,我尝试了

- (void)viewDidAppear:(BOOL)animated
{
    [activityView stopAnimating];
    NSLog(@"did appear %@",[NSDate date]);
}
- (void)viewWillAppear:(BOOL)animated
{
      [super viewWillAppear:animated];
      [activityView startAnimating];
      NSLog(@"will appear %@",[NSDate date]);
}
NSLog
中,两个事件之间没有时间差,事实上,第二个
UIView
在事件
viewdide出现后约1秒内显示。
此时,我将启动一个
UIActivityIndicator
,如代码中所示。但指示器从未显示。
有什么提示吗?

您这里的问题是,您可能因为执行一些磁盘IO或网络活动或繁重的计算而阻塞了主线程,这就是您遇到这种延迟的原因

我建议您在显示
UIActivityIndicator
的同时在辅助线程上执行所有这些操作。完成后,您可以隐藏活动指示器并显示集合视图

编辑:

注意,可能还有更好的方法,但我对集合视图不太熟悉

一个非常简单的修复方法是在加载集合视图的视图控制器中保留一个
BOOL
ivar。调用它
shouldLoadData
,并在
viewDidLoad
方法中将其设置为
NO
。然后,您只需将0返回到
UICollectionViewDelegate
方法
numberOfSectionsInCollectionView:
collectionView:numberOfItemsInSection:

最后,在
视图显示
方法中,将
shouldLoadData
设置为YES,并在
集合视图上调用
重新加载数据
。此时最棘手的部分是找出一种方法来告诉collection视图何时完成了数据的重新加载,以便您可以停止活动指示器

我发现这甚至没有那么棘手,
reloadData
只是在主线程上排队,所以在调用
reloadData
之后,您可以在主线程上排队等待另一个任务。只要做:

[self.collectionView reloadData];
dispatch_async(dispatch_get_main_queue(), ^{        
    [self.activity stopAnimating];
});
你会得到想要的行为。但是,您应该知道,这仍然会阻塞主线程。
例如,如果您有“后退”按钮,则在数据完全加载之前无法按下该按钮(实际上可以按下该按钮,但在此之前不会产生任何可见效果)。

我怀疑。但是,每个集合单元格都有一些嵌套的。在显示视图之前,我进行了一些sql查询。这就是全部。如何为每个单元格启动另一个线程?谢谢。幸运的是,我按照你的建议做了,但行为是一样的。