Tengo una aplicación que se cuelga ocasionalmente debido a la matriz devuelta por ABAddressBookCopyArrayOfAllPeopleInSourceWithSortOrdering() que tiene un tamaño diferente a ABAddressBookGetPersonCount(). El shell del código se muestra a continuación. Por lo general, nPeople es del mismo tamaño que la matriz. Sin embargo, en el iPhone de un usuario (o al menos, según lo informado por un usuario), nPeople es casi dos veces más grande. Puedo detener el bloqueo utilizando el tamaño de la matriz, en lugar de ABAddressBookGetPersonCount(). Sin embargo, no estoy seguro de si esto significa que no estoy accediendo a todos los contactos en el iPhone.ABAddressBookCopyArrayOfAllPeople y ABAddressBookGetPersonCount devuelve diferentes tamaños
- ¿Alguien ha encontrado este problema antes?
- ¿Por qué los números serían diferentes?
Me preguntaba si era algo relacionado con los contactos almacenados en Grupos (no sé si hay grupos, solo una idea). Además, desde la dirección de correo electrónico del usuario, sospecho que usan MobileMe. Me preguntaba si la sincronización con MobileMe crearía duplicados con un recordId diferente, pero no eliminaría el contacto existente, al menos no tan lejos como va ABAddressBookGetPersonCount().
EDIT: He investigado esto un poco más y tengo una idea bastante buena de la causa del problema. Como quería un conjunto ordenado de contactos, utilicé ABAddressBookCopyArrayOfAllPeopleInSourceWithSortOrdering(). Esto requiere una fuente de libreta de direcciones: utilicé la fuente predeterminada. Creo que puede haber varias fuentes: la fuente local más otras como Exchange y MobileMe. Por lo tanto, mi matriz terminará con solo los contactos locales, mientras que el número devuelto por ABAddressBookGetPersonCount() incluirá todas las fuentes, de ahí mi bloqueo. Por lo tanto, creo que sería mejor trabajar con los datos locales en mi aplicación y usar el tamaño de matriz devuelto por ABAddressBookCopyArrayOfAllPeopleInSourceWithSortOrdering en lugar de ABAddressBookGetPersonCount.
CFArrayRef allPeople = InSourceWithSortOrdering(addressBook, source, kABPersonSortByLastName);
CFIndex nPeople = ABAddressBookGetPersonCount(addressBook);
for (int i = 0; i < nPeople; i++)
{
ABRecordRef ref = CFArrayGetValueAtIndex(allPeople, i);
}
que significa que ABAddressBookGetPersonCount siempre debe ser menor que ABAddressBookCopyArrayOfAllPeople? –
Depende. Será diferente si la misma persona puede tener registros adicionales. Si cada persona tiene un número de contacto. Entonces ambos serán lo mismo. :) @NikitaP –