Iphone 为什么通讯簿不能与ios保持同步?
我正在用ios编写一个自定义的addressbook应用程序,我使用了一个单例addressbookRef 以下是我的操作步骤: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: 打开我的通
+ (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];
}];
}