Я создаю таблицу соответствия, сопоставляющую номера телефонов контактов с соответствующими им ABRecordRef (мне это нужно, чтобы я мог эффективно искать имена контактов и фотографии на основе номера телефона, набранного пользователем).
К сожалению, для 500 контактов требуется около 4 секунд, чтобы перебрать все контакты и создать мою справочную таблицу, что заставляет мое приложение загружаться слишком медленно.
Кто-нибудь еще видел подобные проблемы или предлагал какие-либо обходные пути?
Я тестирую на iPhone 3G под управлением ОС V3.0. Проект построен для цели «Устройство 2.1».
Вот код:
ABAddressBookRef lAddressBook = ABAddressBookCreate();
CFArrayRef lRawAddressBookEntries =
ABAddressBookCopyArrayOfAllPeople(lAddressBook);
static NSMutableDictionary sCustomAddressBookPersonRefs =
[[NSMutableDictionary alloc] initWithCapacity:1000];
CFIndex lTotalContactsCount = ABAddressBookGetPersonCount(lAddressBook);
/*************************************************************************/
/* Loop through all the contacts storing a pointer to the address book */
/* entry for each phone number. */
/*************************************************************************/
for (CFIndex i = 0; i < lTotalContactsCount; i++)
{
ABRecordRef lRef = CFArrayGetValueAtIndex(lRawAddressBookEntries, i);
ABMultiValueRef lPhoneNumbers = ABRecordCopyValue(lRef,
kABPersonPhoneProperty);
CFIndex lContactPhoneNumberCount = ABMultiValueGetCount(lPhoneNumbers);
/***********************************************************************/
/* Loop through all the phone numbers available for this contact. */
/***********************************************************************/
for (int j = 0; j < lContactPhoneNumberCount; j++)
{
/*********************************************************************/
/* Get the next phone number and remove the formatting. */
/*********************************************************************/
CFStringRef lPhoneNumber =
ABMultiValueCopyValueAtIndex(lPhoneNumbers, j);
[sCustomAddressBookPersonRefs setValue:(id)lRef
forKey:(NSString *)lPhoneNumber];
CFRelease(lPhoneNumber);
}
CFRelease(lRef);
CFRelease(lPhoneNumbers);
}
CFRelease(lRawAddressBookEntries);
Первая часть кода перед циклом for выполняется всего от 0,2 до 0,75 с (включая ABAddressBookCopyArrayOfAllPeople).
Первоначально во внешнем цикле for была только одна строка NSLog, но я предварительно обработал ее перед тестированием на устройстве.
Увидев проблему, я поместил строки NSLog между каждой строкой кода, и ни одна из строк, казалось, не вызывала значительно более длительных задержек, чем другие. Со всеми этими линиями трассировки на создание таблицы поиска уходит ~ 50 секунд, а на вывод каждой строки требуется около 0,01 секунды с периодической задержкой от 0,1 до 0,2 секунды (не одна и та же строка кода каждый раз).
Любые идеи будут оценены!
Я почти уверен, что ошибок управления памятью нет, так как я запустил проверку утечек. Также, похоже, нет способа найти контакт по отдельности по номеру телефона.
(2 ноября 2009 г.) Я поднял ошибки в Apple по этой проблеме:
Идентификатор ошибки # 7357996 (Производительность) - API-интерфейсы ABAddressBook SDK имеют ужасную производительность
-Bug ID # 7357980 (Улучшение) - ABAddressBook не позволяет искать контакты по номеру телефона