2010-11-24 10 views

Respuesta

18

He aquí un ejemplo extraído de uno de mis libros de direcciones métodos. No estaba buscando por número de teléfono, pero esto le da una idea de cómo avanzar con lo que necesita:

- (void) scanAddressBookSample 
    { 
    NSUInteger i; 
    NSUInteger k; 

    ABAddressBookRef addressBook = ABAddressBookCreate(); 
    NSArray *people = (NSArray *) ABAddressBookCopyArrayOfAllPeople(addressBook); 

    if (people==nil) 
     { 
     NSLog(@"NO ADDRESS BOOK ENTRIES TO SCAN"); 
     CFRelease(addressBook); 
     return; 
     } 

    for (i=0; i<[people count]; i++) 
     { 
     ABRecordRef person = (ABRecordRef)[people objectAtIndex:i]; 

     // 
     // Phone Numbers 
     // 
     ABMutableMultiValueRef phoneNumbers = ABRecordCopyValue(person, kABPersonPhoneProperty); 
     CFIndex phoneNumberCount = ABMultiValueGetCount(phoneNumbers); 

     for (k=0; k<phoneNumberCount; k++) 
      { 
      CFStringRef phoneNumberLabel = ABMultiValueCopyLabelAtIndex(phoneNumbers, k); 
      CFStringRef phoneNumberValue = ABMultiValueCopyValueAtIndex(phoneNumbers, k); 
      CFStringRef phoneNumberLocalizedLabel = ABAddressBookCopyLocalizedLabel(phoneNumberLabel); // converts "_$!<Work>!$_" to "work" and "_$!<Mobile>!$_" to "mobile" 

      // Find the ones you want here 
      // 
      NSLog(@"-----PHONE ENTRY -> %@ : %@", phoneNumberLocalizedLabel, phoneNumberValue); 

      CFRelease(phoneNumberLocalizedLabel); 
      CFRelease(phoneNumberLabel); 
      CFRelease(phoneNumberValue); 
      } 
     } 

    [people release]; 
    CFRelease(addressBook); 
    } 
+2

AlBeebe, Unfortunetly se tarda mucho mucho mucho más tiempo en un dispositivo (iPhone 4, 4.2). Tomé 15 segundos para una libreta de direcciones de 3000) – Rabih

+0

iphone 3GS ios4.2.2 => toma más de 40 segundos para 2000 contactos. No es bueno. – ChangUZ

+0

Muchas gracias, gran trabajo – wod

-1

Usar esto. este es mi código

NSLog(@"=====Make People Array with Numbers. Start."); 
     peopleWithNumber = [[NSMutableDictionary alloc] init]; 
     for (int i=0; i < [people count]; i++) { 
      NSInteger phoneCount = [self phoneCountAtIndex:i]; 
      if (phoneCount != 0) { 
       NSMutableArray *phoneNumbers = [[NSMutableArray alloc] init]; 
       for (int j=0 ; j < phoneCount ; j++) { 
        [phoneNumbers addObject:[self phoneNumberAtIndex:i phoneIndex:j]]; 
       } 
       [peopleWithNumber addEntriesFromDictionary: 
       [NSDictionary dictionaryWithObjectsAndKeys: 
        [NSArray arrayWithArray:phoneNumbers], [self fullNameAtIndex:i], nil]]; 
      } 
     } 
     NSLog(@"=====Make People Array with Numbers. End.\n"); 

método de búsqueda. Sería más rápido que usar el arreglo

"NSArray * people = (NSArray *) ABAddressBookCopyArrayOfAllPeople (addressBook);"

- (NSArray *)searchNamesByNumber:(NSString *)number { 

    NSString *predicateString = [NSString stringWithFormat:@"%@[SELF] contains '%@'",@"%@",number]; 
    NSPredicate *searchPredicate = [NSPredicate predicateWithFormat:predicateString,peopleWithNumber,number]; 
    NSArray *names = [[peopleWithNumber allKeys] filteredArrayUsingPredicate:searchPredicate]; 

    return names; 
} 
5
-(void)createQuickAccessContacts{ 

    NSMutableDictionary contactDictionary= [[NSMutableDictionary alloc]init]; 


    CFArrayRef all = ABAddressBookCopyArrayOfAllPeople(addressBook); 
    CFIndex n = ABAddressBookGetPersonCount(addressBook); 

    NSDate *date=[NSDate date]; 

    for(int i = 0 ; i < n ; i++) 
    { 
     ABRecordRef ref = CFArrayGetValueAtIndex(all, i); 
     ABMultiValueRef phones = (ABMultiValueRef)ABRecordCopyValue(ref, kABPersonPhoneProperty); 

     for(CFIndex j = 0; j < ABMultiValueGetCount(phones); j++) 
     { 

      CFStringRef phoneNumberRef = ABMultiValueCopyValueAtIndex(phones, j); 
      NSString *phoneNumber = (__bridge NSString *)phoneNumberRef; 
      [contactDictionary setObject:(__bridge id)(ref) forKey:phoneNumber]; 


     } 
    } 

    NSLog(@" Time taken %f for %i contacts",[[NSDate date] timeIntervalSinceDate:date],[contactDictionary count]); 

} 

Esta toma como 0,5 segundos para la memoria de 2.5 mil contactos para llenar entonces se puede encontrar el contacto utilizando el número

ABRecordRef ref= [contactDictionary objectForKey:@"89xxxxxxx"]; 

su súper rápida toma como 0.000x segundos

Cuestiones relacionadas