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查询。这就是全部。如何为每个单元格启动另一个线程?谢谢。幸运的是,我按照你的建议做了,但行为是一样的。