ALAssetsLibrary, NSMutable Array и UITableview ленивая прокрутка? - PullRequest
2 голосов
/ 14 февраля 2012

Я пытаюсь реализовать приложение на основе библиотеки ALAssets, извлекающей все изображения и видео из библиотеки фотографий в ios4. Я сохранил ALAsset в NSMutableArray (assets), а затем я отображаю все видео / фото thumnail в ячейке таблицы. Теперь проблема в том, что uitableview не прокручивается плавно. Как я могу решить эту проблему?

В индексе массива NSMutable (активов), имеющего значения этого типа.

    "ALAsset - Type:Photo, URLs:{\n    \"public.png\" = \"assets-library://asset/asset.PNG?id=1000000402&ext=PNG\";\n}",

(or)

    "ALAsset - Type:Video, URLs:{\n    \"com.apple.quicktime-movie\" = \"assets-library://asset/asset.MOV?id=1000000505&ext=MOV\";\n}",

Как я могу отделить только часть URL от этого массива активов. это только эта часть

assets-library://asset/asset.MOV?id=1000000505&ext=MOV

assets-library://asset/asset.PNG?id=1000000402&ext=PNG

Требуется ли реализовать HjCache в этом приложении? Любой другой способ преодолеть эту проблему?

1 Ответ

1 голос
/ 07 декабря 2012

Если вы рассмотрите 3 приведенных ниже пункта, у вас не будет задержек при загрузке изображений из фото-библиотеки

1.Сохраните только ALAsset URL в NSMutableArray вместо ALAsset

. Если вы используете UIImagePicker, вы можете получить его URL через делегат didFinishPickingMediaWithInfo

NSURL* mediaUrl = [info valueForKey:UIImagePickerControllerMediaURL];

2.Используйте ALAsset aspectRatioThumbnail вместо fullResolutionImage

 CGImageRef iref = [myasset aspectRatioThumbnail]; 
 UIImage *loadedImage = [UIImage imageWithCGImage:iref];

3.Выполните связанные с пользовательским интерфейсом вещи в основном потоке.

Поскольку блок ALAssetsLibrary будет выполняться в отдельном потоке.Таким образом, производительность улучшится при работе с пользовательским интерфейсом в основном потоке.

. Для этого используйте

dispatch_sync(dispatch_get_main_queue() или performSelectorOnMainThread

Пример:

 dispatch_sync(dispatch_get_main_queue(), ^{

    cell.imageView.image = [UIImage imageWithCGImage:iref];    

 });//end block

Окончательный код должен выглядеть следующим образом

ALAssetsLibraryAssetForURLResultBlock resultblock = ^(ALAsset *myasset){

 dispatch_sync(dispatch_get_main_queue(), ^{

    GImageRef iref = [myasset aspectRatioThumbnail]; 
    cell.imageView.image = [UIImage imageWithCGImage:iref];   

 });//end block


};
ALAssetsLibraryAccessFailureBlock failureblock  = ^(NSError *myerror)
{
    NSLog(@"Cant get image - %@",[myerror localizedDescription]);
};


ALAssetsLibrary* assetslibrary = [[ALAssetsLibrary alloc] init]; // USE ALAssetsLibrary as single-tone or global while using ARC
[assetslibrary assetForURL:asseturlFromYourArray 
               resultBlock:resultblock
              failureBlock:failureblock];

}
...