連絡先の電話番号を対応するABRecordRefにマッピングするルックアップテーブルを作成しています(ユーザーがダイヤルした電話番号に基づいて連絡先の名前と写真を効率的に検索できます)。iPhoneで読む際のパフォーマンス上の問題
残念ながら、500件の連絡先では、すべての連絡先をループしてルックアップテーブルを作成するために約4秒かかるため、アプリケーションの読み込みが非常に遅くなります。
他に他の人がこのような問題を見たことがありますか、または推奨される対処方法がありますか?
OS V3.0を実行している3G iPhoneでテストしています。このプロジェクトはターゲット 'Device 2.1'用に構築されています。ループのみ(ABAddressBookCopyArrayOfAllPeopleを含む)を実行するために0.2〜0.75秒を要する前
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ループには最初にNSLog行が1つしかありませんでしたが、デバイスでテストする前に前処理しました。
問題を見てから、私はすべてのコード行の間にNSLog行を置いていて、行のどれもが他のものよりかなり長い遅延を引き起こすように見えませんでした。ルックアップテーブルを作成するためにそれらのトレースラインがすべて50秒かかるので、各ラインは約0.01秒で出力され、時折0.1〜0.2秒の遅延があります(毎回同じコード行ではありません)。
いずれかのアイデアをいただければ幸いです!
私はLeaksチェッカーを実行しているので、メモリ管理ミスはありません。電話番号に基づいて連絡先を個別に検索する方法もないようです。
(2009年11月第2回)私は今、この問題のためにAppleとバグを提起している:
-BugのID#7357996(パフォーマンス) - ABAddressBook SDKのAPIはひどいパフォーマンス
-BugのID#7357980(強化)を持っている - ABAddressBookを提供電話番号に基づいて連絡先を検索する方法がありません
アップルは私に、バグID#7357996は、技術者が調査している既知のバグID#5721841の複製であることを教えてくれます。 –