2

我想實現一個基於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

回答

1

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

}