【问题标题】:ALAssetsLibrary, NSMutable Array and UITableview lazy scrolling?ALAssetsLibrary、NSMutable Array 和 UITableview 延迟滚动?
【发布时间】:2012-12-07 12:45:57
【问题描述】:

我正在尝试实现一个基于 ALAssetsLibrary 的应用程序,从 ios4 的照片库中获取所有图像和视频。我将 ALAsset 存储到 NSMutableArray(assets) 中,然后在 tableview 单元格中显示所有视频/照片缩略图。 现在的问题是uitableview滚动不顺畅,我该如何解决这个问题?

在 NSMutable array(assets) 的索引中具有这种类型的值。

    "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? 有没有其他办法解决这个问题?

【问题讨论】:

  • 你必须在这里使用lazyloding的概念
  • 是的,问题是 UITableview 滚动不顺畅。
  • NSURL* stUrl= (NSURL*) [[result defaultRepresentation]url]//结果是ALAsset实例,我们只得到了ALAsset的url部分
  • 我的问题已经解决了,如果你愿意,我会提供详细信息...

标签: objective-c xcode uitableview nsmutablearray alassetslibrary


【解决方案1】:

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

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

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多