2011-08-21 33 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

相關問題