【问题标题】:ios UICollectionView slow scrolling and memory warningios UICollectionView 滚动慢和内存警告
【发布时间】:2015-07-15 01:05:40
【问题描述】:

我目前正在从事一个项目,该项目涉及由从 UIImagepickerController 导入的 AVAssets 填充的 UICollectionView,在集合中有 10 个左右的项目后,滚动变得迟缓且缓慢,并且偶尔会收到内存警告。我认为问题出在实时发生的缩略图生成中,这是我使用的代码:

- (void) setAsset:(AVAsset *)asset
{
    _asset = asset;
    AVAssetImageGenerator *generate = [[AVAssetImageGenerator alloc] initWithAsset:_asset];
    NSError *err = NULL;
    CMTime time = CMTimeMake(1, 60);
    generate.appliesPreferredTrackTransform = YES;
    CGImageRef imgRef = [generate copyCGImageAtTime:time actualTime:NULL error:&err];
    self.VideoImageView.image = [UIImage imageWithCGImage:(imgRef)];
}

是否有另一种不那么“昂贵的方式”可以毫不拖延地实现这一目标? 任何有关此事的帮助将不胜感激。

【问题讨论】:

  • 感谢大家的快速回复,这两种方法我都试过了,虽然现在滚动很流畅,但生成缩略图需要更多时间,导致第一次加载视图时出现空白单元格,经过几次不过几秒钟,一切都很好。

标签: ios objective-c uicollectionview avassetimagegenerator


【解决方案1】:

可以在后台线程实时生成缩略图,操作完成后跳回主线程设置实际缩略图。

现在您在主线程上执行所有操作,这会阻塞 UI,并导致滚动不顺畅。

【讨论】:

    【解决方案2】:

    您可以在单元格中设置占位符图像并在后台队列中生成缩略图。 然后将其设置为您的图像视图。

    AsynImageView 可能对你有用。

    【讨论】:

      【解决方案3】:

      打开另一个线程来处理图像的事情。当您的图像完成后切换回主线程以更新单元格。你可以用 GCD 做到这一点

      【讨论】:

        【解决方案4】:

        这里是异步生成视频缩略图的代码。

        -(void)generateImage
        {
            NSURL *url = [NSURL fileURLWithPath:_videoPath];
            AVURLAsset *asset=[[AVURLAsset alloc] initWithURL:url options:nil];
            AVAssetImageGenerator *generator = [[AVAssetImageGenerator alloc] initWithAsset:asset];
            generator.appliesPreferredTrackTransform=TRUE;
        
            CMTime thumbTime = CMTimeMakeWithSeconds(30,30);
        
            AVAssetImageGeneratorCompletionHandler handler = ^(CMTime requestedTime, CGImageRef im, CMTime actualTime, AVAssetImageGeneratorResult result, NSError *error){
                if (result != AVAssetImageGeneratorSucceeded) {
                    NSLog(@"couldn't generate thumbnail, error:%@", error);
                }
                // TODO Do something with the image
            };
        
            CGSize maxSize = CGSizeMake(128, 128);
            generator.maximumSize = maxSize;
            [generator generateCGImagesAsynchronouslyForTimes:[NSArray arrayWithObject:[NSValue valueWithCMTime:thumbTime]] completionHandler:handler];
        
        }
        

        希望对您有所帮助。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-10-15
          • 1970-01-01
          • 2014-12-24
          相关资源
          最近更新 更多