CNContactStoreDidChangeNotification被多次触发

时间:2016-01-01 22:16:06

标签: ios swift nsnotificationcenter cncontact cncontactstore

我可以在应用处于后台状态时更改联系人数据库时观察CNContactStoreDidChangeNotification。我很确定只有一个观察者被添加到NSNotificationCenter。 即使我只添加一个新联系人,问题是NSNotificationCenter发布多次(2,3,5甚至更多次)。 问题在哪里?

3 个答案:

答案 0 :(得分:4)

确保您没有多次添加观察者。如果(例如)您在视图控制器中从-addObserver-viewDidLoad调用-viewDidAppear(因为这些可能会在您的应用程序的整个生命周期中被调用多次),这可能会在您没有意识到的情况下发生),或来自应用代理中的任何应用状态回调(-applicationDidBecomeActive-applicationWillResignActive-applicationDidEnterBackground-applicationWillEnterForeground等。

在一个条件中包含对-addObserver的调用,确保它只能被调用一次(设置一个标志),并在它周围放置NSLog语句,这样你就可以在调试控制台中看到你是否在那里一旦。在您的代码中搜索您可能忘记的其他-addObserver来电。

在添加之前调用-removeObserver,以确保(确保传递与添加时相同的名称和对象)。在不存在的观察者上调用-removeObserver是可以的。 请注意,这更像是一个创可贴而非修复 - 您的代码应该足够聪明,以便知道您是否已经添加了它 - 但这可能有助于您诊断问题。

我刚刚写了一个快速的最小测试程序,在CNContactStoreDidChangeNotification上添加一个观察者(一次!),我只在添加或更改联系人时收到通知一次。为自己编写一个类似的测试程序,看看你是否得到了相同的结果。如果您的测试程序运行正常,那么您的应用可能正在做一些您不期望的事情(并多次调用-addObserver)。

答案 1 :(得分:0)

我有同样的问题,它发射的次数在2& 2之间变化。 3.对我有用的解决方案是设置一个信号量变量,在处理程序中设置并在完成时重置信号量。将地址簿处理包装在信号量的if语句中以忽略进一步的调用。  addressBkSemphore在buildFrendsAndContacts

中重置为false
xymon server

希望它有所帮助。

答案 2 :(得分:0)

您可以在几秒钟后启动一次性执行计时器或发送计时器,并在这些秒内更新新联系人时取消它,从而确保只有上次更新触发的计时器或dispatch_after将实际执行(考虑到我所测试的所有更新呼叫都在一秒钟之内一个接一个地出现)

顺便说一下,只有在使用我的应用程序更改同一设备上的联系人时,我才能重现此问题。如果我更改链接到同一苹果帐户的其他设备上的联系人,则只有一次更新。

相关问题