我有一个奇怪的问题,我注册我的iOS应用程序来监听电话地址簿中的更改。当地址簿中的内容发生变化时,正确的方法会被调用,但它会被调用2-6次。
当对象被创建时(单例,所以只有一个对象),我用下面的代码注册通知:
ABAddressBookRegisterExternalChangeCallback(notificationAddressBook, addressBookChanged, (__bridge_retained void *)self);调用的方法如下所示:
void addressBookChanged(ABAddressBookRef ab, CFDictionaryRef info, void *context){
ABAddressBookRevert(ab);
NSLog(@"ADDRESSBOOK CHANGED");
[phoneBookCopy updateCopy];
}有什么办法解决这个问题吗?
发布于 2014-06-03 19:35:50
试试这个:
void addressBookChanged(ABAddressBookRef ab, CFDictionaryRef info, void *context){
ABAddressBookRevert(ab);
NSLog(@"ADDRESSBOOK CHANGED");
[phoneBookCopy updateCopy];
CFRelease(ab);
}这对我很有帮助。
发布于 2012-05-17 03:56:49
不久前我也遇到了同样的问题,我不得不通过创建一个NSTimer来处理重复的回调来解决这个问题:
[self.changeTimer invalidate];
self.changeTimer = nil;
self.changeTimer = [NSTimer scheduledTimerWithTimeInterval:3.0
target:self
selector:@selector(handleAdressBookExternalCallbackBackground)
userInfo:nil
repeats:NO];发布于 2013-10-22 22:53:43
我也遇到过类似的问题。回调只会在第一次被调用一次,但是如果我第二次去修改地址簿,那么它就会被调用多次。对我来说,问题在于保存ABAddressBookRegisterExternalChangeCallback的方法是在appDelegate的applicationWillResignActive:方法中调用的。
我使用地址簿的方式是为了同步设置。问题是,每次保存同步设置时,我都会注册外部回调,而不仅仅是在更改同步设置时。
为了进行说明,下面是我在appDelegate中调用的代码
- (void)saveSettings
{
NSUserDefaults *syncSettingsData = [NSUserDefaults standardUserDefaults];
[syncSettingsData setObject:[NSNumber numberWithBool:self.isSyncingiPadContacts] forKey:SYNC_IPAD_CONTACTS_TURNED_ON];
[self setAddressBookChanged];
[syncSettingsData synchronize];
}
- (void)setAddressBookChanged
{
if (self.isSyncingiPadContacts)
{
ABAddressBookRegisterExternalChangeCallback(self.addressBook, addressBookChanged, (__bridge void *)self);
}
else
{
ABAddressBookUnregisterExternalChangeCallback(self.addressBook, addressBookChanged, (__bridge void *) self);
}
}我在saveSettings方法中删除了对setAddressBookChanged的调用,只在创建地址簿(第一次设置)和用户更改同步设置时调用它。
希望这能对你有所帮助。
https://stackoverflow.com/questions/10096480
复制相似问题