2011-08-21 58 views
7

我的应用程序注册回调一次:ABAddressBookRegisterExternalChangeCallback工作,但数据是陈旧

notificationAddressBook = ABAddressBookCreate(); 

ABAddressBookRegisterExternalChangeCallback(notificationAddressBook, MyAddressBookExternalChangeCallback, self); 

然后在我的回调:

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

当添加新的联系人,则触发事件的罚款,并在数据在第一个加法和第二个和第三个中是最新的。问题在于编辑现有联系人的详细信息。

第一次触发事件的数据是正确的,以最后的更新(我改变了iPhone的联系人一个联系人的电话号码),然后切换到该应用程序并获得最新的更新。然后我切换到地址簿,再拍变化,切换到我的应用程序,并得到另一个事件。这次数据是陈旧的,最新的变化没有反映出来。

我试过释放ABAddressBookRef实例并再次调用ABAddressBookCreate(),但它也没有帮助。

任何想法?

回答

3

尝试重新创建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

另外,在上面的示例中可能没有看到,您必须确保您的ABAddressBookRef仅由一个线程使用。 – lef

+1

为什么不使用API​​ ABAddressBookRevert()?在地址簿中装入在地址簿数据库中的信息。 – frank