Mi aplicación registra la devolución de llamada una vez:ABAddressBookRegisterExternalChangeCallback funciona, pero los datos es rancio
notificationAddressBook = ABAddressBookCreate();
ABAddressBookRegisterExternalChangeCallback(notificationAddressBook, MyAddressBookExternalChangeCallback, self);
Luego, en mi devolución de llamada:
void MyAddressBookExternalChangeCallback (ABAddressBookRef notifyAddressBook,CFDictionaryRef info,void *context)
{
NSLog(@"in MyAddressBook External Change Callback");
ABAddressBookRevert(notifyAddressBook);
CFArrayRef peopleRefs = ABAddressBookCopyArrayOfAllPeopleInSource(notifyAddressBook, kABSourceTypeLocal);
CFIndex count = CFArrayGetCount(peopleRefs);
NSMutableArray* people = [NSMutableArray arrayWithCapacity:count];
for (CFIndex i=0; i < count; i++) {
ABRecordRef ref = CFArrayGetValueAtIndex(peopleRefs, i);
ABRecordID id_ = ABRecordGetRecordID(ref);
TiContactsPerson* person = [[[TiContactsPerson alloc] _initWithPageContext:[context executionContext] recordId:id_ module:context] autorelease];
NSLog(@"name: %@", [person valueForKey:@"firstName"]);
NSLog(@"phone: %@", [person valueForKey:@"phone"]);
NSLog(@"modified: %@", [person valueForKey:@"modified"]);
[people addObject:person];
}
CFRelease(peopleRefs);
}
Al añadir un nuevo contacto, el evento se dispara bien, y el los datos están actualizados en la primera adición y el segundo y tercero. El problema es editar los detalles de un contacto existente.
La primera vez que se desencadena el evento los datos son correctos a la última actualización (cambié el número de teléfono de un contacto en los contactos del iPhone), luego cambio a la aplicación y obtengo la última actualización. Luego vuelvo a la libreta de direcciones, hago otro cambio, cambio a mi aplicación y obtengo otro evento. Esta vez los datos están desactualizados, los últimos cambios no se reflejan.
Intenté liberar la instancia ABAddressBookRef
y llamar al ABAddressBookCreate()
otra vez, pero tampoco ayudó.
¿Alguna idea?
Además, lo que no se ve en el ejemplo anterior, debe asegurarse de que su ABAddressBookRef solo se use en un subproceso. – lef
¿por qué no utilizar api ABAddressBookRevert()? La libreta de direcciones se carga con la información en la base de datos de la libreta de direcciones. – frank