我需要使用来自ALAssets的UIImage实例填充许多UIImageView实例(大约10个)。我不想在执行此操作时锁定主线程,因此希望在后台线程中尽可能多地执行此操作。从ALAsset获取CGImage是最耗时的,所以我想把它放在后台线程中。
我遇到的问题是只有第一张图片才能正确加载。任何其他UIImageView实例最终都是空的。
下面是我的(简化)代码。 processAssets方法遍历一组资源,并在后台线程上调用loadCGImage。此方法从ALAsset获取fullScreenImage并将其传递给主线程上的populateImageView,后者使用它生成UIImage并填充UIImageView。
- (void)processAssets {
for(int i = 0; i < [assetArr count]; i++){
ALAsset *asset = [assetArr objectAtIndex:i];
[self performSelectorInBackground:@selector(loadCGImage:) withObject:asset];
}
}
- (void)loadCGImage:(ALAsset *)asset
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
CGImageRef imgRef = CGImageRetain([[asset defaultRepresentation] fullScreenImage]);
[self performSelectorOnMainThread:@selector(populateImageView:) withObject:imgRef waitUntilDone:YES];
CGImageRelease(imgRef);
[pool release];
}
- (void)populateImageView:(CGImageRef)imgRef
{
UIImage *img = [[UIImage imageWithCGImage:imgRef] retain];
UIImageView *view = [[UIImageView alloc] initWithImage:image];
}
我不确定为什么这不能正常工作。有什么想法吗?
答案 0 :(得分:3)
你应该尝试这样的事情(使用积木)
dispatch_async(dispatch_get_global_queue( DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{
//load the fullscreenImage async
dispatch_async(dispatch_get_main_queue(), ^{
//assign the loaded image to the view.
});
});
干杯,
亨德里克