所以我的目标是创建这样的东西:
我的问题是当我在段之间切换时,我想显示一个 UIActivityViewIndicator 旋转,因为加载图像需要一些时间(本地存储,所以理论上这应该更快......)。但线程似乎在切换到新细胞的图像之前返回。
我做错了什么?
这是我的代码:
- (void)reloadCollection {
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{
[_myCollection reloadData];
[_myCollection layoutIfNeeded];
dispatch_async(dispatch_get_main_queue(), ^{
_spinnerView.hidden = YES;
});
});
}
- (IBAction)segmentedControlSwitched:(id)sender{
_spinnerView.hidden = NO;
[self reloadCollection];
}
-(NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView {
return 1;
}
-(NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section {
if ([_mySegmentedControl selectedSegmentIndex] == 0){
return [_photosTaken count];
}else
return [_photosTagged count];
}
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath{
UICollectionViewCell *cell;
UIImageView *imageView;
if ([_mySegmentedControl selectedSegmentIndex] == 0){
cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"cell" forIndexPath:indexPath];
imageView = [[UIImageView alloc] initWithImage:[_photosTaken objectAtIndex:indexPath.row]];
}
else
{
cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"cell1" forIndexPath:indexPath];
imageView = [[UIImageView alloc] initWithImage:[_photosTagged objectAtIndex:indexPath.row]];
}
imageView.frame = cell.frame;
[cell setBackgroundView:imageView];
return cell;
}
谢谢, 若昂·加西亚.
最佳答案
您不能在后台线程上调用 UIKit 操作,除非文档明确说明可以。
无论如何,您的问题不应该简单地通过将东西放在后台线程上来解决。
您自己说,由于某种原因加载线程花费的时间太长。为什么不使用仪器中的时间分析器来找出原因?
您可能会发现问题是您每次都创建一个全新的 ImageView 并将其添加为单元格背景 View 。
创建、添加和删除 View 是一项昂贵的操作,不应在滚动时执行。您的自定义 Collection View 单元格应该已经有一个 ImageView ,您已将其添加到 Storyboard或自定义 init 方法中,并为其创建了一个 socket 或属性。不使用子类单元格是非常不寻常的,因为基本单元格在内容 View 中没有任何内容。
填充单元格时,只需将 ImageView 的图像属性设置为存储的图像即可。这应该足够快,您不需要旋转器。
从您的评论来看,您似乎也遇到了以下问题:
- 您使用的图像太大。要在列表中显示,您必须使用适当大小的缩略图
- 您正在模拟器上进行性能测试。这与设备上的实际应用程序性能无关。内存情况完全不同,速度可能更快或更慢,具体取决于操作(通常,基于 CPU 的速度更快,但基于 GPU 的速度更慢)。
关于ios - UISegmentedControl 具有两个 UICollectionViews 来显示图像。多线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26597788/