Objective c 从背景线程上的ALAssetRepresentation获取全屏图像

Objective c 从背景线程上的ALAssetRepresentation获取全屏图像,objective-c,thread-safety,uiimage,cgimage,alasset,Objective C,Thread Safety,Uiimage,Cgimage,Alasset,我需要用这些集合中的UIImage实例填充许多UIImageView实例(大约10个)。我不想在这样做的时候锁定主线程,所以我希望在后台线程中尽可能多地锁定主线程。从ALAsset获取CGImage是最耗时的,所以我想把它放在一个背景线程中 我遇到的问题是,实际上只有第一个图像被正确加载。任何其他UIImageView实例最终都是空的 下面是我的(简化)代码。processAssets方法遍历资产数组,并在后台线程上调用loadCGImage。此方法从ALAsset获取fullScreenIma

我需要用这些集合中的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];
}
-(void)processAssets{
对于(int i=0;i<[assetArr count];i++){
ALAsset*资产=[assetArr objectAtIndex:i];
[self-performSelectorInBackground:@selector(loadCGImage:)withObject:asset];
}
}
-(无效)loadCGImage:(ALAsset*)资产
{    
NSAutoreleasePool*池=[[NSAutoreleasePool alloc]init];
CGImageRef imgRef=CGImageRetain([[asset defaultRepresentation]fullScreenImage]);
[self-performSelectorOnMainThread:@selector(populateImageView:)with-object:imgRef waitUntilDone:YES];
CGImageRelease(imgRef);
[池释放];
}
-(无效)populateImageView:(CGImageRef)imgRef
{
UIImage*img=[[UIImage-imageWithCGImage:imgRef]retain];
UIImageView*视图=[[UIImageView alloc]initWithImage:image];
}

我不知道这为什么不能正常工作。有什么想法吗?

你应该试试这样的方法(使用块)

干杯


亨德里克

您应该尝试类似的方法(使用块)

干杯

亨德里克

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.
    });
});