mientras que acceder a los contactos de iCloud en mi aplicación ocasiona un locking en iOS

Quiero acceder a los contactos de mi libreta de direcciones en mi aplicación, puedo recuperar con éxito todos los contactos de mi libreta de direcciones pero si sincronizo mi count i-cloud en mi iPad, mi libreta de direcciones se actualiza también desde mis contactos i-cloud, y si ahora accedo a mis contactos, se produce un locking. Por favor, ayúdame, estoy completamente atorado, no sé qué hacer. Puedo acceder fácilmente a los contactos de la libreta de direcciones, pero una vez que se sincroniza desde i-cloud y después de que recupero la libreta de direcciones, se produce un locking y me da un error excesivo.

Aquí está el código que usé para search contactos.

+(NSArray *)getAllContacts { CFErrorRef *error = nil; ABAddressBookRef addressBook = ABAddressBookCreateWithOptions(NULL, error); __block BOOL accessGranted = NO; if (ABAddressBookRequestAccessWithCompletion != NULL) { // we're on iOS 6 dispatch_semaphore_t sema = dispatch_semaphore_create(0); ABAddressBookRequestAccessWithCompletion(addressBook, ^(bool granted, CFErrorRef error) { accessGranted = granted; dispatch_semaphore_signal(sema); }); dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER); } else { // we're on iOS 5 or older accessGranted = YES; } if (accessGranted) { #ifdef DEBUG NSLog(@"Fetching contact info ----> "); #endif ABAddressBookRef addressBook = ABAddressBookCreateWithOptions(NULL, error); ABRecordRef source = ABAddressBookCopyDefaultSource(addressBook); CFArrayRef allPeople = ABAddressBookCopyArrayOfAllPeopleInSourceWithSortOrdering(addressBook, source, kABPersonSortByFirstName); CFIndex nPeople = ABAddressBookGetPersonCount(addressBook); NSMutableArray* items = [NSMutableArray arrayWithCapacity:nPeople]; for (int i = 0; i < nPeople; i++) { MContact *contacts = [MContact new]; ABRecordRef person = CFArrayGetValueAtIndex(allPeople, i); //get First Name and Last Name contacts.firstName = (__bridge NSString*)ABRecordCopyValue(person, kABPersonFirstNameProperty); contacts.lastName = (__bridge NSString*)ABRecordCopyValue(person, kABPersonLastNameProperty); if (!contacts.firstName) { contacts.firstName = @""; } if (!contacts.lastName) { contacts.lastName = @""; } NSMutableArray *contactEmails = [NSMutableArray new]; ABMultiValueRef multiEmails = ABRecordCopyValue(person, kABPersonEmailProperty); for (CFIndex i=0; i<ABMultiValueGetCount(multiEmails); i++) { CFStringRef contactEmailRef = ABMultiValueCopyValueAtIndex(multiEmails, i); NSString *contactEmail = (__bridge NSString *)contactEmailRef; [contactEmails addObject:contactEmail]; // NSLog(@"All emails are:%@", contactEmails); } if([contactEmails count]==0){ } else{ [contacts setemails:contactEmails]; [items addObject:contacts]; } #ifdef DEBUG #endif } return items; } else { #ifdef DEBUG NSLog(@"Cannot fetch Contacts :( "); #endif return NO; } } 

¿Encontraste exactamente dónde se anexa el fallo en tu código? Si está en su bucle "for (int i = 0; i <nPeople; i ++)", puede que tenga un problema en 1 contacto solamente …

PS 1, debe eliminar la línea 7: …. ABAddressBookCreateWithOptions, ya que primero necesita verificar la autorización …

PS 2, ¿realmente solo necesitabas contactos de la fuente pnetworkingeterminada? ¿Qué pasa si el usuario también ha contactado desde Lotus Notes u otro gmail …?

Veo un problema pero no estoy seguro de que solucionará tu falla … Debes replace tu _ bridge por _bridge_transfer :

 contacts.firstName = (__bridge_transfer NSString*)ABRecordCopyValue(person,kABPersonFirstNameProperty); 

Haz lo mismo para el apellido …

Si no solucionó el locking, sugeriría que intentara aislar a la "persona" en su crash de brujas AB e intentar saltearlo en su "bucle for". Esto debería ayudarnos a saber si solo es un problema con esta persona o si está relacionado con el número de personas a cargar. En mi aplicación ABLocation, sé que algunos usuarios tienen> 500 contactos, y no tienen PB …