我可以在应用处于后台状态时更改联系人数据库时观察CNContactStoreDidChangeNotification
。我很确定只有一个观察者被添加到NSNotificationCenter
。
即使我只添加一个新联系人,问题是NSNotificationCenter
发布多次(2,3,5甚至更多次)。
问题在哪里?
答案 0 :(得分:4)
确保您没有多次添加观察者。如果(例如)您在视图控制器中从-addObserver
或-viewDidLoad
调用-viewDidAppear
(因为这些可能会在您的应用程序的整个生命周期中被调用多次),这可能会在您没有意识到的情况下发生),或来自应用代理中的任何应用状态回调(-applicationDidBecomeActive
,-applicationWillResignActive
,-applicationDidEnterBackground
,-applicationWillEnterForeground
等。
在一个条件中包含对-addObserver
的调用,确保它只能被调用一次(设置一个标志),并在它周围放置NSLog语句,这样你就可以在调试控制台中看到你是否在那里一旦。在您的代码中搜索您可能忘记的其他-addObserver
来电。
在添加之前调用-removeObserver
,以确保(确保传递与添加时相同的名称和对象)。在不存在的观察者上调用-removeObserver
是可以的。 请注意,这更像是一个创可贴而非修复 - 您的代码应该足够聪明,以便知道您是否已经添加了它 - 但这可能有助于您诊断问题。
我刚刚写了一个快速的最小测试程序,在CNContactStoreDidChangeNotification
上添加一个观察者(一次!),我只在添加或更改联系人时收到通知一次。为自己编写一个类似的测试程序,看看你是否得到了相同的结果。如果您的测试程序运行正常,那么您的应用可能正在做一些您不期望的事情(并多次调用-addObserver
)。
答案 1 :(得分:0)
我有同样的问题,它发射的次数在2& 2之间变化。 3.对我有用的解决方案是设置一个信号量变量,在处理程序中设置并在完成时重置信号量。将地址簿处理包装在信号量的if语句中以忽略进一步的调用。 addressBkSemphore在buildFrendsAndContacts
中重置为falsexymon server
希望它有所帮助。
答案 2 :(得分:0)
您可以在几秒钟后启动一次性执行计时器或发送计时器,并在这些秒内更新新联系人时取消它,从而确保只有上次更新触发的计时器或dispatch_after将实际执行(考虑到我所测试的所有更新呼叫都在一秒钟之内一个接一个地出现)
顺便说一下,只有在使用我的应用程序更改同一设备上的联系人时,我才能重现此问题。如果我更改链接到同一苹果帐户的其他设备上的联系人,则只有一次更新。