2011-08-21 9 views
7

mia app registra il callback una volta:ABAddressBookRegisterExternalChangeCallback funziona, ma i dati è stantio

notificationAddressBook = ABAddressBookCreate(); 

ABAddressBookRegisterExternalChangeCallback(notificationAddressBook, MyAddressBookExternalChangeCallback, self); 

Poi nel mio callback:

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

Quando si aggiunge un nuovo contatto, l'evento viene attivato bene, e il i dati sono aggiornati nella prima aggiunta e nella seconda e terza. Il problema è con la modifica dei dettagli di un contatto esistente.

La prima volta che l'evento viene attivato, i dati sono corretti per l'ultimo aggiornamento (ho cambiato il numero di telefono di un contatto nei contatti dell'iPhone), quindi si passa all'app e si ottiene l'ultimo aggiornamento. Poi torno alla rubrica, apporto un'altra modifica, passa alla mia app e ricevo un altro evento. Questa volta i dati sono obsoleti, le ultime modifiche non si riflettono.

Ho provato a rilasciare l'istanza ABAddressBookRef e chiamare di nuovo ABAddressBookCreate() ma non è stato d'aiuto neanche.

Qualche idea?

risposta

3

Provare a ricreare 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

Inoltre, ciò che potrebbe non essere visualizzato nell'esempio precedente, è necessario assicurarsi che il proprio ABAddressBookRef sia utilizzato solo da un thread. – lef

+1

perché non utilizzare api ABAddressBookRevert()? La rubrica viene caricata con le informazioni nel database della Rubrica. – frank

Problemi correlati