使用performSelectorInBackground在后台加载UITableViewCell图像,性能

时间:2009-12-27 00:25:06

标签: iphone objective-c cocoa-touch uitableview

我有一个在后台加载UITableViewCell图像的方法。我使用performSelectorInBackground。问题是这些线程正在完成并加载图像,即使它们可能不再出现在屏幕上。这可能会对资源产生负担,特别是当使用快速滚动并创建大量单元格时。图像相当小,从磁盘(sqlite db)加载,而不是从URL加载。

我已将代码放入单元格中以检查它是否是最近显示的单元格,如果不是,则不加载图像。这是有效的,但它仍然在创建线程,即使从磁盘加载图像的“昂贵”工作没有被执行,除非它是最新的单元格。

问题是,处理这个问题的最佳方法是什么?我应该在每次重用UITableViewCell时杀死现有线程吗?如何杀死performSelectorInBackground调用的线程?

对于如何处理此问题的任何其他建议表示赞赏。

2 个答案:

答案 0 :(得分:5)

你看过EGOImageView吗?

答案 1 :(得分:0)

您可以考虑一次只加载一张图片。您仍然可以在线程上执行此操作,但序列化负载,以免系统负担过重。

当可见单元格变为可见时,可以将它们添加到数组中,当单元格变为不可见时,您可以将它们从列表中删除(或者只是检查它们是否在方便的时候可见)。您还可以尝试将负载延迟一段时间,以避免加载刚刚滚动的图像。该线程将弹出列表中的第一个项目并加载它,然后排队另一个加载。

对于线程技术,您可以查看Operation Queues或使用NSThread创建专用线程。 Concurrency Programming Guide提供了很好的概述。虽然您使用的方法没有任何问题。

在线程之间共享数据还需要某种形式的锁定以避免同时访问。