UITableView - 延迟加载联系人图像

时间:2010-12-08 13:31:25

标签: iphone core-data concurrency uitableview addressbook

我正在开发一个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();

        }

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

2 个答案:

答案 0 :(得分: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 ;

    } ] ;

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

答案 1 :(得分:1)

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

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