2

我正在尝试实现一个基于 ALAssetsLibrary 的应用程序,从 ios4 的照片库中获取所有图像和视频。我将 ALAsset 存储到 NSMutableArray(assets) 中,然后在 tableview 单元格中显示所有视频/照片缩略图。现在的问题是 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?有没有其他方法可以解决这个问题?

4

1 回答 1

1

如果您考虑以下 3 件事,则在加载照片库图像时不会有任何延迟

1.只存储ALAsset URL到你的NSMutableArray而不是ALAsset

如果您使用的是 UIImagePicker,您可以通过 didFinishPickingMediaWithInfo 委托获取它的 URL

NSURL* mediaUrl = [info valueForKey:UIImagePickerControllerMediaURL];

2.使用 ALAssetaspectRatioThumbnail 代替fullResolutionImage

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

3.在主线程中做UI相关的东西。

因为ALAssetsLibrary块将在单独的线程中执行。因此,在主线程中执行与 UI 相关的操作时,性能会有所提高。

为此,请使用

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];

}
于 2012-12-07T04:45:57.553 回答