我正在创建一个iPhone应用程序,它将从Web API(包括电子邮件地址)中提取数据。我想在表格单元格中显示与每个电子邮件地址相关联的图像,因此我正在搜索地址簿中的图像,并且如果电子邮件地址不在书中,则会回到默认值。这个伟大的工程,但我有几个担心:什么是在iPhone上进行异步图像缓存的最佳方法?
性能:我已经找到了要找的电子邮件地址(或电话号码)地址簿记录食谱据报道rather slow。原因在于必须迭代每个地址簿记录,并且为每个具有图像的人重复遍历所有电子邮件地址以找到匹配项。当然,这对于大型地址簿来说可能非常耗时。
表格单元:所以我想我会收集所有的电子邮件地址,我需要找到图像并一次找到它们。通过这种方式,我只对所有地址遍历该书一次。但是这对于表格单元格不适用,其中每个单元格对应一个电子邮件地址。我要么必须在显示任何单元格之前收集所有图像(可能会很慢),要么每个单元格在加载时都会查看每个图像(甚至更慢,因为我需要遍历书籍以找到匹配每个电子邮件地址)。
异步查找:那么我想我会查找他们批量,但异步使用
NSInvocationOperation
。对于AddressBook中的每个图像,我都会在应用程序沙箱中保存一个缩略图。然后每个单元格都可以引用该文件,并显示缺省值(如果它不存在)(因为它不在书中或尚未找到)。如果稍后在异步查找中找到图像,下次需要显示图像时,图像会突然出现。这可能适用于图像的定期再生(例如,在地址簿中更改图像时)。但是,对于我的应用程序的任何给定实例,图像可能实际上不会显示一段时间。异步表格单元格查找:理想情况下,我会使用类似markjnet's asynchronous table cell updating更新表格单元格中的图像一旦被下载。但是为了达到这个目的,我们不得不为每个单元显示
NSInvocationOperation
作业,因为它显示的内容以及沙盒中缺少缓存图标。但之后我们又回到了低效地遍历整个地址簿 - 如果您刚刚下载了一大堆新的电子邮件地址,那么这可能会是很多问题。
所以我的问题是:别人怎么做到这一点?我在摆弄Tweetie2,看起来它会异步更新显示的表格单元格。我假设它发送一个单独的HTTP请求为它需要的每个图像。如果是这样,我想通过电子邮件地址搜索本地地址簿效率不是那么低,所以也许这是最好的方法?只是不担心与搜索地址簿相关的性能问题?
如果是这样,在沙箱中保存缩略图图像是缓存的最佳方法?如果我想创建一份新工作来更新地址簿中所有更改的缩略图,每天一次,那么最好的方法是什么?
你们其他人如何解决这类问题?建议将非常感谢!
谢谢。实际上,我已经实现了一种可以一次查找一个地址的解决方案,但它会创建一个缩略图并将其保存到沙盒Documents目录中。是的,它只在第一次需要显示地址簿时查找地址簿中的图像。我*认为从沙盒加载缓存的图像应该足够快,不需要是异步的。 我不需要您描述的最新级别,所以接下来我将介绍如何计划缓存缩略图的定期更新 - 是的,我只会遍历地址簿一次为所有人。 – theory 2010-02-16 00:08:57
只是好奇,你怎么能一次查找一个地址,但只能通过地址簿迭代一次? – erikprice 2010-02-17 16:37:58