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?
Inoltre, ciò che potrebbe non essere visualizzato nell'esempio precedente, è necessario assicurarsi che il proprio ABAddressBookRef sia utilizzato solo da un thread. – lef
perché non utilizzare api ABAddressBookRevert()? La rubrica viene caricata con le informazioni nel database della Rubrica. – frank