我创建一个查找表映射联系人的电话号码,其对应的ABRecordRef(我需要这个,所以我可以高效地查找联系人的名字和照片基于用户已拨的电话号码)。

不幸的是,为500个联系它通过所有联系人大约需要4秒循环,并创建我的查找表,这让我的应用程序加载太慢。

有其他人见过这样的问题,或者有任何建议的解决办法?

我测试在3G版iPhone上运行OS 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年11月),我现在提出的bug与苹果针对此问题:点击 -Bug ID#7357996(性能) - ABAddressBook SDK的API有可怕的性能结果 -Bug ID#7357980(增强) - ABAddressBook没有提供方法基于电话号码来查找接触

有帮助吗?

解决方案

如果你不能优化routinue,还可以派生一个新的线程用于装载,那么该应用可以继续加载和响应给用户。

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

-(void)loadContactsInAnotherThread:(void *)obj
{
     NSLog("Do time intensive stuff here.");
}

其他提示

有真的没有答案。我对应用商店应用的拨号器类型和我的应用程序从同一个问题的困扰。 AB的API是真的限制联系人查询方面。你能做的最好的是一些动画代码,以使等待的痛苦。

我是有大的地址簿性能类似的问题。我用于匹配和大中央调度NSPredicates加载从每次请求的方法时,地址簿中只有一次,而不是接触。该代码是在这里: HTTP:/ /hesh.am/2012/10/lookup-a-contact-name-using-phone-number-in-abaddressbook/

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top