Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c ABAddressBookRegisterExternalChangeCallback工作,但数据已过时_Objective C_Ios4_Addressbook - Fatal编程技术网

Objective c ABAddressBookRegisterExternalChangeCallback工作,但数据已过时

Objective c ABAddressBookRegisterExternalChangeCallback工作,但数据已过时,objective-c,ios4,addressbook,Objective C,Ios4,Addressbook,我的应用程序注册回调一次: notificationAddressBook = ABAddressBookCreate(); ABAddressBookRegisterExternalChangeCallback(notificationAddressBook, MyAddressBookExternalChangeCallback, self); 然后在我的回调中: void MyAddressBookExternalChangeCallback (ABAddressBookRef not

我的应用程序注册回调一次:

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);
}
void MyAddressBookExternalChangeCallback(ABAddressBookRef notifyAddressBook,CFDictionaryRef信息,void*上下文)
{
NSLog(@“在MyAddressBook外部更改回调中”);
ABAddressBookRevert(notifyAddressBook);
CFArrayRef peopleRefs=abAddressBookCopyArrayFallPeopleInSource(notifyAddressBook,kABSourceTypeLocal);
CFIndex count=CFArrayGetCount(peopleRefs);
NSMutableArray*people=[NSMutableArray阵列容量:count];
对于(CFIndex i=0;i
添加新联系人时,事件会被触发,并且第一次添加以及第二次和第三次添加的数据都是最新的。问题在于编辑现有联系人的详细信息

第一次触发事件时,数据与上次更新一致(我在iPhone联系人中更改了一个联系人的电话号码),然后切换到应用程序并获取最新更新。然后,我切换回通讯簿,进行另一个更改,切换到我的应用程序并获取另一个事件。这一次数据过时,不会反映最新的更改

我试图释放
ABAddressBookRef
实例并再次调用
ABAddressBookCreate()
,但也没有任何帮助


有什么想法吗?

尝试重新创建一个AddressBookRef

    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);    
    }
void MyAddressBookExternalChangeCallback(ABAddressBookRef notifyAddressBook,CFDictionaryRef信息,void*上下文)
{
NSLog(@“在MyAddressBook外部更改回调中”);
//ABAddressBookRevert(notifyAddressBook);
notifyAddressBook=ABAddressBookCreate();
CFArrayRef peopleRefs=abAddressBookCopyArrayFallPeopleInSource(notifyAddressBook,kABSourceTypeLocal);
CFIndex count=CFArrayGetCount(peopleRefs);
NSMutableArray*people=[NSMutableArray阵列容量:count];
对于(CFIndex i=0;i
此外,在上面的示例中可能看不到的是,您必须确保您的ABAddressBookRef仅由一个线程使用。为什么不使用api ABAddressBookRevert()?通讯簿将加载通讯簿数据库中的信息。