2011-08-21 19 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); 
} 

जब एक नया संपर्क जोड़ने, घटना ठीक शुरू हो रहा है, और डेटा पहले जोड़े और दूसरे और तीसरे में अद्यतित है। समस्या मौजूदा संपर्क के विवरण को संपादित करने के साथ है।

पहली बार ईवेंट ट्रिगर किया गया डेटा अंतिम अपडेट के लिए सही है (मैंने आईफोन संपर्कों में एक संपर्क का फोन नंबर बदल दिया है), फिर मैं ऐप पर स्विच करता हूं और नवीनतम अपडेट प्राप्त करता हूं। फिर मैं एड्रेस बुक पर वापस जाता हूं, एक और बदलाव करता हूं, अपने ऐप पर स्विच करता हूं और एक और घटना प्राप्त करता हूं। इस बार डेटा पुराना है, नवीनतम परिवर्तन प्रतिबिंबित नहीं होते हैं।

मैंने 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

एपीआई ABAddressBookRevert() का उपयोग क्यों नहीं करें? पता पुस्तिका पता पुस्तिका डेटाबेस में जानकारी के साथ लोड की गई है। – frank

संबंधित मुद्दे