the*_*ory 10 iphone caching asynchronous image abaddressbook
我正在创建一个iPhone应用程序,它将从Web API中提取数据,包括电子邮件地址.我想在表格单元格中显示与每个电子邮件地址关联的图像,因此我在地址簿中搜索图像,如果电子邮件地址不在书中,则返回默认值.这很好用,但我有一些顾虑:
性能:据我所知,通过电子邮件地址(或电话号码)查找地址簿记录的食谱相当缓慢.原因是必须遍历每个地址簿记录,并且对于每个具有图像的记录,迭代所有电子邮件地址以查找匹配.当然,这对于大型地址簿来说可能是耗时的.
表格单元格:所以我想我会收集所有需要查找图像的电子邮件地址并立即找到它们.这样我只对所有地址遍历一次书.但这对表格单元格不起作用,其中每个单元格对应一个电子邮件地址.我要么显示任何细胞(可能慢)之前收集的所有图像,或者每个单元中查找每个图像的加载(更慢,因为我需要通过这本书来迭代找到一个匹配的每个电子邮件地址).
异步查找:那么我想我会批量查找它们,但异步,使用NSInvocationOperation.对于在AddressBook中找到的每个图像,我会在应用程序沙箱中保存一个缩略图.然后每个单元格可以引用此文件并显示默认值(如果它不存在(因为它不在书中或尚未找到)).如果稍后在异步查找中找到图像,则下次需要显示图像时,它会突然出现.这可能适用于图像的周期性再生(例如,当地址簿中的图像已被更改时).但是对于我的应用程序的任何给定实例,图像可能实际上不会出现一段时间.
异步表单元格查找:理想情况下,我会使用像markjnet的异步表格单元格更新来更新表格单元格,并在下载后再映像.但为了实现这一点,我必须为NSInvocationOperation显示的每个单元格分离一个作业,如果沙箱中缺少缓存的图标.但是接下来我们又回到了无效地遍历每个地址簿的整个地址簿 - 如果您刚刚下载了大量新的电子邮件地址,那么它们可能会很多.
所以我的问题是:其他人如何做到这一点?我正在摆弄Tweetie2,它看起来像是异步更新显示的表格单元格.我假设它正在为它需要的每个图像发送一个单独的HTTP请求.如果是这样,我想通过电子邮件地址搜索本地地址簿效率不高,那么这可能是最好的方法吗?只是不担心与搜索地址簿相关的性能问题?
如果是这样,将沙盒中的缩略图保存为缓存的最佳方法?如果我想创建一个新工作来更新所有缩略图,并且地址簿中的任何更改都说每天一次,那么这样做的最佳方法是什么?
你们其他人如何解决这类问题?建议将不胜感激!
无论您使用什么策略来实际缓存图像,如果可能的话,每次您获得一批电子邮件地址时,我只会遍历一次地址簿数据。(是的,我会异步执行此操作。)
创建一个 NSMutableDictionary 它将用作搜索结果的内存缓存。使用下载中的每个电子邮件地址作为键,并使用哨兵作为该键的值(例如[NSNull null])来初始化此字典。
接下来,迭代地址簿中的每个 ABRecordRef,调用ABRecordCopyValue(record, kABPersonEmailProperty)并循环返回的每个 ABMultiValue 中的结果。如果任何电子邮件地址是缓存中的键,请设置[NSNumber numberWithInt:ABRecordGetRecordId(record)]为字典中该键的值。
使用此字典作为查找索引,您可以根据用户当前的滚动位置快速获取当前在表视图中显示的电子邮件地址的 ABRecordRefs 图像,如 hoopjones 的答案中所建议的那样。如果您的应用程序需要“最新”级别,您可以添加地址簿更改侦听器以使缓存无效,触发另一个索引操作,然后更新视图。
| 归档时间: |
|
| 查看次数: |
4197 次 |
| 最近记录: |