2011-08-21 9 views
7

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?

Respuesta

3

Intente volver a crear ABAddressBookRef.

void MyAddressBookExternalChangeCallback (ABAddressBookRef notifyAddressBook,CFDictionaryRef info,void *context) 
    { 
     NSLog(@"in MyAddressBook External Change Callback"); 

     //ABAddressBookRevert(notifyAddressBook); 
     notifyAddressBook = ABAddressBookCreate(); 

     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);  
    } 
+1

Además, lo que no se ve en el ejemplo anterior, debe asegurarse de que su ABAddressBookRef solo se use en un subproceso. – lef

+1

¿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

Cuestiones relacionadas