Iphone 为什么通讯簿不能与ios保持同步?

Iphone 为什么通讯簿不能与ios保持同步?,iphone,ios,addressbook,Iphone,Ios,Addressbook,我正在用ios编写一个自定义的addressbook应用程序,我使用了一个单例addressbookRef 以下是我的操作步骤: + (ABAddressBookRef) sharedAddressBook { static ABAddressBookRef ref = nil; if ( ref == nil ) { ref = ABAddressBookCreate(); } return ( ref ); } 步骤1: 打开我的通

我正在用ios编写一个自定义的addressbook应用程序,我使用了一个单例addressbookRef

以下是我的操作步骤:

+ (ABAddressBookRef) sharedAddressBook
{
    static ABAddressBookRef ref = nil;
    if ( ref == nil )
    {
        ref = ABAddressBookCreate();
    }

    return ( ref );
}
步骤1: 打开我的通讯录应用程序

    ABAddressBookRef addressBook = [ABAddressBook sharedAddressBook];
    ABRecordRef person = ABAddressBookGetPersonWithRecordID( addressBook, 83 );
    NSString* name= ABRecordCopyValue(person,kABPersonFirstNameProperty);
    NSLog(@"%@",name);
控制台打印“aaa”

步骤2:

退出我的应用程序(enterBackground,而不是kill),使用系统拨号程序将“aaa”人名更改为“bbb”

步骤3:

打开我的应用程序(enterForeground),做同样的事情

ABAddressBookRef addressBook = [ABAddressBook sharedAddressBook];
ABRecordRef person = ABAddressBookGetPersonWithRecordID( addressBook, 83 );
NSString* name= ABRecordCopyValue(person,kABPersonFirstNameProperty);
NSLog(@"%@",name);
控制台打印“aaa”

我的问题是

1.为什么控制台在使用旧addressBookRef时打印“aaa”,而不是“bbb”?当我将[ABAddressBook sharedAddressBook]更改为ABAddressBookCreate()时,一切似乎都正常。为什么旧的addressBookRef不能保持最新

2.是否每次都需要在EnterForegroude上执行ABAddressBookCreate()


3.编辑人员信息时记录ID是否更改?我怀疑。

原因是与通讯簿的交互是事务性的。请特别参阅文档。在应用程序运行时,由您注册以了解数据库中的更改。然后应还原或保存:

当您收到更改回调时,您可以做两件事:如果没有未保存的更改,代码只需还原通讯簿即可获取最新数据


现在我在外部更改回调时重新加载AddressBook async!reloadAddressbook需要重新分配所有person(包装)实例,但无需重新创建其缓存数据。

ABAddressBookRegisterExternalChangeCallback在我恢复应用程序时被调用。但我的问题仍然存在,比如:我是否需要重新创建ABAddressBookRef=ABAddressBookCreate()在MyAddressBookExternalChangeCallback中?如果我只使用ABAddressBookSave(旧的ABAddressBookRef),数据将过时。谢谢。我使用了以下解决方案:当我恢复应用程序时,正在调用ABAddressBookRegisterExternalChangeCallback。但我的问题仍然存在,比如:stackoverflow.com/questions/7138718/…我是否需要在MyAddressBookExternalChangeCallback中重新创建ABAddressBookRef=ABAddressBookCreate()?如果我只使用ABAddressBookSave(旧的ABAddressBookRef),数据将过时。记录ID保持不变。。唯一的问题是,您需要新的地址簿引用来获取新数据。它的工作原理与数据库实例类似。记录ID保持不变,我将引用所有AbrecordRef并获取基本数据。异步重新加载地址簿,在不需要提高效率时不刷新缓存数据(如搜索索引)
static void _ExternalChangeCallback( ABAddressBookRef bookRef, CFDictionaryRef info, void * context )
{
    HMAddressBook * hmAddressBook = (HMAddressBook *)context;

    [hmAddressBook _resetSharedRef];
}

@implementation HMAddressBook
@synthesize addressBookRef = _ref;

+ (HMAddressBook *)sharedAddressBook
{
    static HMAddressBook * volatile __shared = nil;

    if ( __shared == nil )
    {
        HMAddressBook * tmp = [[HMAddressBook alloc] init];
        if ( OSAtomicCompareAndSwapPtr(nil, tmp, (void * volatile *)&__shared) == false )
            [tmp release];
    }

    return ( __shared );
}


- (void)_resetSharedRef
{
    if (_ref != NULL)
    {
        ABAddressBookUnregisterExternalChangeCallback(_ref, _ExternalChangeCallback, self);
        CFRelease(_ref);
    }
    _ref = ABAddressBookCreate();
    ABAddressBookRegisterExternalChangeCallback(_ref, _ExternalChangeCallback, self);

    if(_delegate && [_delegate respondsToSelector:@selector(addressBookDidResetSharedRef:)])
    {
        [_delegate addressBookDidResetSharedRef:self];
    }

}
- (void)addressBookDidResetSharedRef:(HMAddressBook *)addressBook
{
    NSLog(@"addressBookDidReset");    
    [self reloadAddressBookData_async:^(BOOL finished) {
        [completionBlock reloadData];
    }];

}