UITableView - 延迟加载联系人图片

Posted

技术标签:

【中文标题】UITableView - 延迟加载联系人图片【英文标题】:UITableView - Lazy loading contact images 【发布时间】:2010-12-08 13:31:25 【问题描述】:

我正在开发一个 iPhone 应用程序,它在 UITableView 中显示联系人的缩略图。

在我打开缩略图之前,一切都非常快,然后滚动变得非常慢。 所有其他数据都由 Core Data 提供支持,我尝试事先将图像保存在 Core Data 中,但这本身在启动时花费的时间太长,而且不太灵活等。

我真正需要的是一种使用单独的线程或 NSOperation 等懒惰地进行查找和准备缩略图的方法,但我不确定完成此操作的最简单方法是什么。

Apple 的示例项目 LazyTableImages 如果图像来自网络,那就太棒了,当然可以调整,尽管我很难使用它。基本上问题是一样的,但不是下载和网络延迟等时间延迟,我的延迟只是在用户通讯录中查找图片所需的时间。

这是我的表格单元子类中我需要同时执行的任务:

        UIImage *contactImage = nil;
        if (ABPersonHasImageData(person)) 

        NSData *contactImageData = (NSData*)ABPersonCopyImageData(person);
        UIImage *tempContactImage = [UIImage imageWithData:contactImageData];
        [contactImageData release];

        UIGraphicsBeginImageContext(CGSizeMake(45.0f, 45.0f));             
       [tempContactImage drawInRect:CGRectMake(0.0f, 0.0f, 45.0f, 45.0f)];          
       contactImage = UIGraphicsGetImageFromCurrentImageContext();
        UIGraphicsEndImageContext();

        

非常感谢任何有帮助的提示或代码以简单而优雅的方式完成此任务的人。

【问题讨论】:

【参考方案1】:

如果你已经有一个UIImage,为什么还要绘制到contactImage?你可以直接使用 tempContactImage ,不是吗?

一个好的开始是简单地这样做:

cell.imageView.image = tempContactImage

编辑:

怎么样:

ABPersonRef person = ...get person...
UITableViewCell * cell = ...get cell...
[ [ NSOperationQueue mainQueue ] addOperation:
    [ NSBlockOperation blockOperationWithBlock:^
        if (ABPersonHasImageData(person)) 
        ...
        
        cell.imageView.image = contactImage ;

     ] ;

如果仍然不稳定(可能是),您可以在后台线程中将需要应用到表格视图的图像排队,等到表格视图停止滚动,然后应用任何待处理的图像更改。

【讨论】:

如果您绘制到contactImage只是为了缩放以适应45.0x45.0,您也可以使用上面的代码并执行cell.imageView.contentMode = UIViewContentModeScaleAspectFill ABPersonCopyImageData(person); CFDataRef imageData = ABPersonCopyImageDataWithFormat(person, kABPersonImageFormatThumbnail); 谢谢,但如果你只是使用:ABPersonCopyImageData(person);您将获得完整尺寸的联系人图像,无论该尺寸是多少。这实际上会使 iPhone 应用程序中的表格视图与具有某些格式的联系人图像的用户崩溃。现在我们需要使用新的更安全的低内存函数:CFDataRef imageData = ABPersonCopyImageDataWithFormat(person, kABPersonImageFormatThumbnail); 是的,谢谢,应该可以。尽管我最终为该项目所做的是将所有联系人数据保存到后台 GCD 队列上的核心数据中,并在需要时更新它。这让我可以根据需要对记录进行排序,并让所有日期等都准备好通知等,无论联系人数量如何,加上完美的丝滑滚动。 不要忘记:一个 NSManagedObjectContext 是不可重入的,所以你不能同时从不同的线程/操作访问。 (不是说你在做这个,只是要注意一些事情——我最近被这个咬了)【参考方案2】:

使用此方法。 kABPersonImageFormat*缩略图*

(NSData*)ABPersonCopyImageDataWithFormat([targetPeople objectAtIndex:index], kABPersonImageFormatThumbnail)

【讨论】:

以上是关于UITableView - 延迟加载联系人图片的主要内容,如果未能解决你的问题,请参考以下文章

UITableView 延迟加载问题

延迟加载 - UITableview 可见单元格不显示图像

使用 Alamofire 在 UITableview 中延迟加载 API 请求

在具有滚动索引的 UITableView 中延迟加载图像

如何在 UITableView 中实现类似 UIImageView 的延迟加载

如何在 UITableView 中高效加载图片?