ios - UISegmentedControl 具有两个 UICollectionViews 来显示图像。多线程

标签 ios objective-c multithreading uicollectionview uisegmentedcontrol

所以我的目标是创建这样的东西:

enter image description here

enter image description here

我的问题是当我在段之间切换时,我想显示一个 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/

相关文章:

iphone - 为什么下面的代码行没有向数组添加任何内容,而数组只产生 null

iOS 线程并在主线程上更改 UI

c - 为什么我的函数没有运行并出现无效内存错误?

ios - 移动 safari 位置 :fixed z-index glitch when scrolling

objective-c - WindowController、IBOutlets 和面向对象编程?

ios - 如何从库及其地址列表中进行符号化?

iphone - 如何将 NSString 转换为 NSData?并且数据与字符串内容相同

java - 让一个线程等待另一个线程完成

ios - GoogleMaps 目标未在 Pods 项目中创建

ios - 使用 AFNetworking 上传视频导致内存问题