我正在使用以下代码生成一个缩略图栏:
NSArray *times = [self timesForDuration:_videoAsset.duration andCount:self.numberOfThumbnails];
__block int i = 0;
[_imageGenerator generateCGImagesAsynchronouslyForTimes:times completionHandler:^(CMTime requestedTime, CGImageRef image, CMTime actualTime, AVAssetImageGeneratorResult result, NSError *error) {
if (result == AVAssetImageGeneratorSucceeded) {
UIImageView *imageView = [self imageViewForImage:image atPosition:i];
CGImageRelease(image);
dispatch_async(dispatch_get_main_queue(), ^{
[_videoBarView addSubview:imageView];
});
}
++i;
}];
它有点工作,但问题是视图整体更新非常缓慢,你可以看到栏中的空白......一段时间后,栏会按预期显示所有请求的缩略图。
从调试器我可以看出缩略图生成实际上非常快,那么这里发生了什么?
我见过一种解决方法,只会使用copyCGImageAtTime
同步生成每个图像,但这可能会导致用户界面无法响应。
答案 0 :(得分:1)
问题似乎是由UIImageView
块之外的dispatch_async
对象的创建引起的;将该代码放在块中可以解决问题:
if (result == AVAssetImageGeneratorSucceeded) {
__block int position = i;
CGImageRetain(image);
dispatch_async(dispatch_get_main_queue(), ^{
UIImageView *imageView = [self imageViewForImage:image atPosition:position];
[_videoBarView addSubview:imageView];
CGImageRelease(image);
});
}
++i;