Получение fullScreenImage из ALAssetRepresentation в фоновом потоке - PullRequest
0 голосов
/ 23 июня 2011

Мне нужно заполнить несколько экземпляров UIImageView (около 10) экземплярами UIImage из ALAssets. Я не хочу блокировать основной поток при этом, поэтому хочу сделать как можно больше в фоновом потоке. Получение CGImage от ALAsset занимает больше всего времени, поэтому я хотел бы поместить его в фоновый поток.

У меня проблема в том, что только первое изображение действительно загружается правильно. Все остальные экземпляры UIImageView заканчиваются пустыми.

Ниже мой (упрощенный) код. Метод processAssets просматривает массив ресурсов и вызывает loadCGImage в фоновом потоке. Этот метод получает fullScreenImage из ALAsset и передает его в 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];
}

Я не уверен, почему это не работает должным образом. Есть идеи?

1 Ответ

3 голосов
/ 05 июля 2011

Вы должны попробовать что-то вроде этого (используя блоки)

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

Ура,

Хендрик

...