ALAssetsLibrary,NSMutable Array和UITableview惰性滚动?

问题描述:

我想实现一个基于ALAssetsLibrary的应用程序,该应用程序从ios4中的照片库中获取所有图像和视频。我将ALAsset存储到NSMutableArray(资产)中,然后将所有视频/照片thumnail显示在tableview单元格中。 现在问题是uitableview不滚动顺畅,我怎么能过来这个问题?ALAssetsLibrary,NSMutable Array和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? 任何其他方式来解决这个问题?

+0

你必须在这里使用lazyloding概念 – 2012-02-14 05:26:44

+0

是的,问题是UITableview不能平滑滚动。 – 2012-02-14 05:31:25

+0

NSURL * stUrl =(NSURL *)[[result defaultRepresentation] url] //结果是ALAsset实例,我们只得到了ALAsset的url部分 – 2012-02-14 11:49:15

F你考虑以下三样东西,你不会有任何延迟,同时loading图片库的图像

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

如果您正在使用UIImagePicker,你可以通过didFinishPickingMediaWithInfo代理得到它的网址

NSURL* mediaUrl = [info valueForKey:UIImagePickerControllerMediaURL];

2.使用ALAsset aspectRatioThumbnail而不是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]; 

}