首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ABAddressBookRegisterExternalChangeCallback调用了几次

ABAddressBookRegisterExternalChangeCallback调用了几次
EN

Stack Overflow用户
提问于 2012-04-11 05:07:38
回答 4查看 4.2K关注 0票数 9

我有一个奇怪的问题,我注册我的iOS应用程序来监听电话地址簿中的更改。当地址簿中的内容发生变化时,正确的方法会被调用,但它会被调用2-6次。

当对象被创建时(单例,所以只有一个对象),我用下面的代码注册通知:

代码语言:javascript
复制
ABAddressBookRegisterExternalChangeCallback(notificationAddressBook, addressBookChanged, (__bridge_retained  void *)self);

调用的方法如下所示:

代码语言:javascript
复制
void addressBookChanged(ABAddressBookRef ab, CFDictionaryRef info, void *context){
ABAddressBookRevert(ab);

    NSLog(@"ADDRESSBOOK CHANGED");
    [phoneBookCopy updateCopy];
}

有什么办法解决这个问题吗?

EN

回答 4

Stack Overflow用户

发布于 2014-06-03 19:35:50

试试这个:

代码语言:javascript
复制
void addressBookChanged(ABAddressBookRef ab, CFDictionaryRef info, void *context){
ABAddressBookRevert(ab);

    NSLog(@"ADDRESSBOOK CHANGED");
    [phoneBookCopy updateCopy];
    CFRelease(ab);
}

这对我很有帮助。

票数 3
EN

Stack Overflow用户

发布于 2012-05-17 03:56:49

不久前我也遇到了同样的问题,我不得不通过创建一个NSTimer来处理重复的回调来解决这个问题:

代码语言:javascript
复制
[self.changeTimer invalidate];
self.changeTimer = nil;
self.changeTimer = [NSTimer scheduledTimerWithTimeInterval:3.0
                                                            target:self
                                                          selector:@selector(handleAdressBookExternalCallbackBackground)
                                                          userInfo:nil
                                                           repeats:NO];
票数 1
EN

Stack Overflow用户

发布于 2013-10-22 22:53:43

我也遇到过类似的问题。回调只会在第一次被调用一次,但是如果我第二次去修改地址簿,那么它就会被调用多次。对我来说,问题在于保存ABAddressBookRegisterExternalChangeCallback的方法是在appDelegate的applicationWillResignActive:方法中调用的。

我使用地址簿的方式是为了同步设置。问题是,每次保存同步设置时,我都会注册外部回调,而不仅仅是在更改同步设置时。

为了进行说明,下面是我在appDelegate中调用的代码

代码语言:javascript
复制
- (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的调用,只在创建地址簿(第一次设置)和用户更改同步设置时调用它。

希望这能对你有所帮助。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10096480

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档