iOS 在 UITableView 中显示来自 ALAsset 的图像
Posted
技术标签:
【中文标题】iOS 在 UITableView 中显示来自 ALAsset 的图像【英文标题】:iOS showing Image from ALAsset in UITableView 【发布时间】:2012-11-09 13:36:19 【问题描述】:我有一个存储项目的数据库。这些项目可以是不同类型的类型,如文本、视频和图像。加载视图时,我从数据库中获取这些项目并将它们显示在 UITableView 中。我面临的问题与在表格视图中显示图像有关。基本上在数据库中,我存储与图片相关的 ALAsset 链接,并尝试使用以下代码从中获取其图像:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
//...Other Code
else if ([object isMemberOfClass:[Picture class]])
//Get a reusable cell
cell = [tableView dequeueReusableCellWithIdentifier:@"pictureCellIdentifier"];
// [self performSelectorInBackground:@selector(performAsset:) withObject:dict];
ALAssetsLibraryAssetForURLResultBlock resultblock = ^(ALAsset *myasset)
ALAssetRepresentation *rep = [myasset defaultRepresentation];
CGImageRef iref = [rep fullResolutionImage];
if (iref)
((PictureViewCell *)cell).placeHolderImageView.hidden = YES;
((PictureViewCell *)cell).pictureImageView.image = [UIImage imageWithCGImage:[rep fullResolutionImage] scale:[rep scale] orientation:(UIImageOrientation)[rep orientation]];
;
ALAssetsLibraryAccessFailureBlock failureblock = ^(NSError *myerror)
[Utility showAlertViewWithTitle:@"Location Error" message:@"You must activate Location Services to access the photo" cancelButtonTitle:@"Dismiss"];
;
ALAssetsLibrary* assetslibrary = [[ALAssetsLibrary alloc] init];
[assetslibrary assetForURL:[NSURL URLWithString:((Picture *)objectInArray).imagePath]
resultBlock:resultblock
failureBlock:failureblock];
//Set the background for the cell
cell.backgroundView = iv;
//...Other code
问题在于,当您在单元格中滑动时,会调用该方法并且应用程序非常慢。所以我想有更好的方法来实现我想要做的事情。我还尝试使用performselectorInBackground:
执行该代码。性能似乎更好,但获取图像需要更多时间。
任何帮助将不胜感激。
谢谢!
【问题讨论】:
看看这个示例代码是否能满足您的需求。该示例基本上展示了如何在UITableView
中加载大量图像。 developer.apple.com/library/ios/#samplecode/LazyTableImages/…
该示例使用从 Web 服务加载图像,但您将看到他们通过 NSOperation
加载图像的部分
【参考方案1】:
这里有一些可以改进的地方。
第一个如您所想:在后台线程中加载资产,然后在主线程上准备好图像时将其添加到单元格中。接下来,您将为您显示的每个单元格创建一个 ALAssetsLibrary
对象。理想情况下,一个应用程序应该只有一个 ALAssetsLibrary
对象,只要您需要它就可以保留它。在第一次需要时创建一个ALAssetsLibrary
,然后重复使用它。
- (ALAssetsLibrary *)defaultAssetsLibrary
if (_library == nil)
_library = [[ALAssetsLibrary alloc] init];
return _library;
最后,您在表格视图单元格中使用fullResolutionImage
。如果您真的只需要显示图像,thumbnailImage
或至少fullScreenImage
应该足够了。
- (void) loadImage:(NSNumber *)indexPath url:(NSURL*)url
int index = [indexPath intValue];
ALAssetsLibraryAssetForURLResultBlock resultblock = ^(ALAsset *myasset)
CGImageRef iref = [[myasset defaultRepresentation] fullScreenImage];
if (iref)
// TODO: Create a dictionary with UIImage and cell indexPath
// Show the image on main thread
[self performSelectorOnMainThread:@selector(imageReady:) withObject:result waitUntilDone:NO];
;
ALAssetsLibraryAccessFailureBlock failureblock = ^(NSError *myerror)
[Utility showAlertViewWithTitle:@"Location Error" message:@"You must activate Location Services to access the photo" cancelButtonTitle:@"Dismiss"];
;
[[self defaultAssetsLibrary] assetForURL:url
resultBlock:resultblock
failureBlock:failureblock];
-(void) imageReady:(NSDictionary *) result
// Get the cell using index path
// Show the image in the cell
【讨论】:
感谢您的回答,但似乎如果我使用performSelectorInBackground:withObject:
调用方法 - (void) loadImage:(NSNumber *)indexPath url:(NSURL*)url
,则结果块永远不会被调用!
你打的怎么样?您应该将方法签名更改为loadImage:(NSDictionary*)params
,然后发送带有 indexPath 和 url 的字典。然后您可以检索loadImage:
中的参数。所以你应该打电话给[self performSelectorInBackground@selector(loadImage:):withObject:dict]
以上是关于iOS 在 UITableView 中显示来自 ALAsset 的图像的主要内容,如果未能解决你的问题,请参考以下文章
UITableView 不显示来自 responseObject 的数据
iOS - “来自故事板“Main”的 UIViewController,但没有得到 UITableView