在iPhone ABAddressBook中读取性能问题

Dan*_*n J 3 iphone objective-c addressbook iphone-sdk-3.0

我正在创建一个查找表,将联系电话号码映射到相应的ABRecordRef(我需要这样,这样我就可以根据用户拨打的电话号码有效地查找联系人姓名和照片).

不幸的是,对于500个联系人,需要大约4秒钟来遍历所有联系人并创建我的查找表,这使得我的应用程序加载速度太慢.

有没有其他人看到这样的问题或有任何建议的解决方法?

我正在测试运行OS V3.0的3G iPhone.该项目是为目标"设备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);
Run Code Online (Sandbox Code Playgroud)

for循环之前的代码的第一部分只需要0.2到0.75秒来运行(包括ABAddressBookCopyArrayOfAllPeople).

最初在外部for循环中只有一条NSLog线路,但是我在设备上进行测试之前对其进行了预处理.

在看到问题后,我在每行代码之间放置了NSLog行,并且没有任何行似乎导致比其他行更长的延迟.使用所有这些跟踪线需要大约50秒来创建查找表,每条线大约需要0.01秒输出,偶尔会有0.1到0.2秒的延迟(每次都不是相同的代码行).

任何想法,将不胜感激!

当我运行Leaks检查程序时,我非常有信心没有内存管理错误.似乎也没有任何方法可以根据电话号码单独查找联系人.

(2009年11月2日)我现在已经针对此问题向Apple提出了错误:
-Bug ID#7357996(性能) - ABAddressBook SDK API性能
很差-Bug ID#7357980(增强功能) - ABAddressBook无法查找基于手机的联系人数

NWC*_*der 6

如果您无法优化routinue,您还可以为加载分叉一个新线程,然后该应用程序可以继续加载并对用户做出响应.

[NSThread detachNewThreadSelector:@selector(_loadContactsInAnotherThread:) toTarget:self withObject:self];

-(void)loadContactsInAnotherThread:(void *)obj
{
     NSLog("Do time intensive stuff here.");
}
Run Code Online (Sandbox Code Playgroud)