2012-10-22 46 views
2

什麼是從相機膠捲,保存的照片加載10-20全屏圖像的快速方法?ALAssetsLibrary太慢 - Objective-C

我正在使用此代碼,但要加載10張照片,我需要等待大約5-10秒。我正在使用iPhone 4S。

ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init]; 
[library enumerateGroupsWithTypes:ALAssetsGroupSavedPhotos usingBlock:^(ALAssetsGroup *group, BOOL *stop) { 
    if(_savedPhotos.count>=11) *stop = YES; 
    [group enumerateAssetsWithOptions:NSEnumerationReverse usingBlock:^(ALAsset *result, NSUInteger index, BOOL *needToStop) { 
     NSLog(@"%d",index); 
     if(_savedPhotos.count<11) 
     { 
      UIImage *image = [UIImage imageWithCGImage:result.defaultRepresentation.fullScreenImage]; 
      [_savedPhotos addObject:image]; 
     } 
     else 
     { 
      *needToStop = YES; 
     } 
    }]; 
} failureBlock:^(NSError *error) { 
    NSLog(@"%@",error.description); 
}]; 

回答

4

ALAssetsLibrary庫將在單獨的線程中運行。因此與UI相關的和其他的東西進行溝通可能需要時間。

因此,在ALAssetsLibrary塊中使用-performSelectorOnMainThread:withObject:waitUntilDone:

更改您的代碼如下

ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init]; 
[library enumerateGroupsWithTypes:ALAssetsGroupSavedPhotos usingBlock:^(ALAssetsGroup *group, BOOL *stop) { 
    [group enumerateAssetsWithOptions:NSEnumerationReverse usingBlock:^(ALAsset *result, NSUInteger index, BOOL *needToStop) { 
      NSLog(@"%d",index); 
      UIImage *image = [UIImage imageWithCGImage:result.defaultRepresentation.fullScreenImage]; 
      [self performSelectorOnMainThread:@selector(usePhotolibraryimage:) withObject:image waitUntilDone:NO]; 
     }]; 
    } 

    failureBlock:^(NSError *error) { 
      NSLog(@"%@",error.description); 
    }]; 

- (void)usePhotolibraryimage:(UiImage *)myImage{ 

    //Do your all UI related and all stuff here 
} 

注意:瞧上this issue too

+0

我已經實現了您的代碼並將全屏圖像更改爲縮略圖,並將ALAsset *結果保存到NSMutableArray,並在需要時訪問它。它速度更快,佔用更少的內存。 –

+0

你不想將圖像轉換爲手動縮略圖.. ALAssetsLibrary將直接提供縮略圖 –

+0

是的,我這樣做:) –