我正在尝试实现一个基于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];
}