2015-05-11 41 views
0

在获取生日或随机变量的电子邮件时,我得到EXC_BAD_ACCESS问题。我尝试使用下面的代码,当我使用dispatch_async运行它时失败。ABRecordCopyValue中的EXC BAD ACCESS

ABAddressBook addressBook = ABAddressBookCreateWithOptions(NULL, error); 

CFArrayRef allPeople = ABAddressBookCopyArrayOfAllPeople(addressBook); 
CFIndex nPeople = ABAddressBookGetPersonCount(addressBook); 
int maxThreads = 8; 
int chunkSize = (int)(nPeople/maxThreads); 

for (int loopNum = 0; loopNum < maxThreads; loopNum++) 
{ 
    int initCondition = chunkSize*loopNum; 
    int termCondition = (loopNum==(maxThreads-1)) ? (int)nPeople : chunkSize*(loopNum+1); 

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 
     for (int i=initCondition; i<termCondition; i++) 
     { 
      @try { 
       ABRecordRef person = CFArrayGetValueAtIndex(allPeople, i); 

       NSString *firstName = (__bridge NSString *)(ABRecordCopyValue(person, kABPersonFirstNameProperty)) ? (__bridge NSString *)(ABRecordCopyValue(person, kABPersonFirstNameProperty)) : @""; 
       NSString *lastName = (__bridge NSString *)(ABRecordCopyValue(person, kABPersonLastNameProperty)) ? (__bridge NSString *)(ABRecordCopyValue(person, kABPersonLastNameProperty)) :@""; 

       NSString *birthDate = (__bridge NSString *)(ABRecordCopyValue(person, kABPersonBirthdayProperty)); 

       ABMultiValueRef emailMultiValue = ABRecordCopyValue(person, kABPersonEmailProperty); 
       NSArray *emailAddresses = (__bridge NSArray *)ABMultiValueCopyArrayOfAllValues(emailMultiValue); 

       ABMultiValueRef phoneNumbers = ABRecordCopyValue(person, kABPersonPhoneProperty); 

       NSMutableArray *numbers = [NSMutableArray arrayWithCapacity:ABMultiValueGetCount(phoneNumbers)]; 
       for (CFIndex i = 0; i < ABMultiValueGetCount(phoneNumbers); i++) 
       { 
        NSString *phoneNumber = (__bridge_transfer NSString *) ABMultiValueCopyValueAtIndex(phoneNumbers, i); 
        phoneNumber = [self removeSpecialChars:phoneNumber]; 
        if ([phoneNumber length] >= 8) 
        { 
         NSString *mobileNumber = [self getPhoneNuber:phoneNumber];; 
         if ([mobileNumber length] > 7 && [mobileNumber length] < 11) 
          [numbers addObject:mobileNumber]; 
        } 
       } 
       NSString *mobileNumbers = [numbers componentsJoinedByString:@","]; 
      } 
      @catch (NSException *exception) 
      { 
       NSLog(@"%@", exception); 
      } 
     } 
    }); 
} 

当我运行没有dispatch_async块的代码时,它运行时没有错误。我想用dispatch_async块并行扫描地址簿并检测本地数据库的任何更改。

回答

2

documentation for ABAddressBookRef它声明这些对象只能在一个线程上创建和使用。您的代码似乎在原始线程上创建了ABAddressBookAVRecordRefs,然后从dispatch_async块访问它们。我会建议找到另一种方法来做到这一点,在后台线程上创建“及时”ABAddressBookAVRecordRefs

Another question还有一些更多的相关信息...

+0

谢谢@ipmcc。但是,您是否有解决方案来快速扫描地址簿与本地联系人并找到新的联系人信息? – meteors

+0

不是特别的。这听起来像是一个不同的问题。我建议你创建一个单独的问题。 – ipmcc