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 中显示来自 JSON 的数据

UITableView 不显示来自 responseObject 的数据

iOS - “来自故事板“Main”的 UIViewController,但没有得到 UITableView

iOS:UITableView 表数据未显示在子类别中:iPhone

IOS开发之UITableView的奇技

用来自 JSON Request iOS 的字典填充 UITableView