我有一个在后台加载UITableViewCell图像的方法。我使用performSelectorInBackground。问题是这些线程正在完成并加载图像,即使它们可能不再出现在屏幕上。这可能会对资源产生负担,特别是当使用快速滚动并创建大量单元格时。图像相当小,从磁盘(sqlite db)加载,而不是从URL加载。
我已将代码放入单元格中以检查它是否是最近显示的单元格,如果不是,则不加载图像。这是有效的,但它仍然在创建线程,即使从磁盘加载图像的“昂贵”工作没有被执行,除非它是最新的单元格。
问题是,处理这个问题的最佳方法是什么?我应该在每次重用UITableViewCell时杀死现有线程吗?如何杀死performSelectorInBackground调用的线程?
对于如何处理此问题的任何其他建议表示赞赏。
答案 0 :(得分:5)
你看过EGOImageView吗?
答案 1 :(得分:0)
您可以考虑一次只加载一张图片。您仍然可以在线程上执行此操作,但序列化负载,以免系统负担过重。
当可见单元格变为可见时,可以将它们添加到数组中,当单元格变为不可见时,您可以将它们从列表中删除(或者只是检查它们是否在方便的时候可见)。您还可以尝试将负载延迟一段时间,以避免加载刚刚滚动的图像。该线程将弹出列表中的第一个项目并加载它,然后排队另一个加载。
对于线程技术,您可以查看Operation Queues或使用NSThread创建专用线程。 Concurrency Programming Guide提供了很好的概述。虽然您使用的方法没有任何问题。
在线程之间共享数据还需要某种形式的锁定以避免同时访问。