2011-08-21 34 views
7

Ứng dụng của tôi đăng ký gọi lại một lần:ABAddressBookRegisterExternalChangeCallback hoạt động, nhưng dữ liệu là cũ

notificationAddressBook = ABAddressBookCreate(); 

ABAddressBookRegisterExternalChangeCallback(notificationAddressBook, MyAddressBookExternalChangeCallback, self); 

Sau đó, trong callback của tôi:

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

Khi thêm một số liên lạc mới, sự kiện này được kích hoạt tốt, và dữ liệu được cập nhật trong phần bổ sung đầu tiên và phần thứ hai và thứ ba. Vấn đề là chỉnh sửa chi tiết liên lạc hiện có.

Lần đầu tiên sự kiện được kích hoạt dữ liệu chính xác cho bản cập nhật cuối cùng (tôi đã thay đổi số điện thoại của một liên hệ trong danh bạ trên iPhone), sau đó chuyển sang ứng dụng và nhận bản cập nhật mới nhất. Sau đó, tôi chuyển về sổ địa chỉ, thực hiện một thay đổi khác, chuyển sang ứng dụng của tôi và nhận một sự kiện khác. Lần này dữ liệu đã cũ, những thay đổi mới nhất không được phản ánh.

Tôi đã cố gắng phát hành phiên bản ABAddressBookRef và gọi lại ABAddressBookCreate() nhưng cũng không giúp ích gì.

Bất kỳ ý tưởng nào?

Trả lời

3

Cố gắng tạo lại 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

Ngoài ra, những gì có thể không được nhìn thấy trong ví dụ trên, bạn phải đảm bảo rằng ABAddressBookRef chỉ được sử dụng bởi một chuỗi. – lef

+1

tại sao không sử dụng api ABAddressBookRevert()? Sổ địa chỉ được tải với thông tin trong cơ sở dữ liệu Sổ Địa chỉ. – frank

Các vấn đề liên quan