ALAssetsLibrary、NSMutable Array和UITableview延迟滚动



我正在尝试实现一个基于ALAssetsLibrary的应用程序,从ios4中的照片库获取所有图像和视频。我将ALAsset存储到NSMutableArray(assets)中,然后在tableview单元格中显示所有视频/照片thumbail。现在的问题是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.只将ALAsset URL存储到NSMutableArray中,而不是ALAsset

如果你正在使用UIImagePicker,你可以通过didFinishPickingMediaWithInfo代理获得URL

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

最新更新