Независимо от того, какую стратегию вы используете для фактического кэширования изображений, я бы сделал только один проход через данные адресной книги каждый раз, когда вы получаете партию адресов электронной почты, если это возможно. (И да, я бы сделал это асинхронно.)
Создайте NSMutableDictionary, который будет служить кешем в памяти для результатов поиска. Инициализируйте этот словарь, указав в качестве ключа каждый адрес электронной почты из загружаемого файла, а в качестве значения этого ключа укажите часовой (например, [NSNull null]
).
Затем выполните итерацию по каждому ABRecordRef в адресной книге, вызывая ABRecordCopyValue(record, kABPersonEmailProperty)
и просматривая результаты в каждом возвращаемом ABMultiValue. Если какой-либо из адресов электронной почты является ключом в вашем кэше, установите [NSNumber numberWithInt:ABRecordGetRecordId(record)]
в качестве значения этого ключа в вашем словаре.
Используя этот словарь в качестве поискового индекса, вы можете быстро получить изображения ABRecordRefs только для тех адресов электронной почты, которые вы в данный момент отображаете в табличном представлении, с учетом текущей позиции прокрутки пользователя, как предлагается в ответе Хоопджонса. Вы можете добавить прослушиватель изменения адресной книги, чтобы сделать недействительным ваш кеш, запустить другую операцию индексации, а затем обновить представление, если вашему приложению необходим этот уровень «актуальности».