当应用程序处于后台状态时,当联系人数据库发生变化时,我可以观察到CNContactStoreDidChangeNotification
。我非常确定只有一个观察者被添加到NSNotificationCenter
。问题是,即使我只添加了一个新联系人,NSNotificationCenter
也会发布多次(2,3,5,甚至更多次)。问题出在哪里?
发布于 2017-04-27 01:56:35
确保您没有多次添加观察者。如果(例如)从视图控制器中的-viewDidLoad
或-viewDidAppear
调用-addObserver
(因为在应用程序的整个生命周期中可能会多次调用它们),或者从应用程序委托中的任何应用程序状态回调(-applicationDidBecomeActive
、-applicationWillResignActive
、-applicationDidEnterBackground
、-applicationWillEnterForeground
等),则可能会在您没有意识到的情况下发生这种情况。
将对-addObserver
的调用封装在一个条件中,以确保它只能被调用一次(设置一个标志),并在其周围放置NSLog语句,以便在多次到达时可以在调试控制台中看到。在代码中搜索您可能忘记的对-addObserver
的其他调用。
在添加之前调用-removeObserver
,只是为了确保(确保传递与添加时相同的名称和对象)。在一个不存在的观察者上调用-removeObserver
是可以的。注意,这更像是一个创可贴,而不是修复-您的代码应该足够智能,知道您是否已经添加了它-但这可能会帮助您诊断问题)。
我刚刚写了一个快速的最小测试程序,它添加了一个观察者(一次!)在CNContactStoreDidChangeNotification
上,我只在添加或更改联系人时收到一次通知。为你自己写一个类似的测试程序,看看你是否得到了同样的结果。如果您的测试程序工作正常,那么很可能您的应用程序正在做一些您没有预料到的事情(并且多次调用-addObserver
)。
发布于 2017-07-12 17:30:00
我遇到了同样的问题,它触发的次数在2到3之间。对我有效的解决方案是设置一个信号量变量,在处理程序中设置,并在完成时重置信号量。将地址簿处理封装在信号量的if语句中,以忽略进一步的调用。在buildFrendsAndContacts中将addressBkSemphore重置为false
- (void)addressBkChange:(NSNotification *)note
{
if (addressBkSemphore == false)
{
addressBkSemphore = TRUE;
[self buildFrendsAndContacts];
}
}
希望能有所帮助。
发布于 2018-01-14 03:13:06
您可以在几秒钟后启动一次执行计时器或调度,并在这几秒内有新的联系人更新时取消它,从而确保只有由最后一次更新触发的计时器或dispatch_after才会实际执行(考虑到所有更新调用在一秒内一个接一个地到来。差异,就我测试而言)
顺便说一句,我只能在使用我的应用程序对同一设备上的联系人进行更改时才能重现该问题。如果我更改了链接到同一个apple帐户的另一台设备上的联系人,则只有一次更新。
https://stackoverflow.com/questions/34560581
复制相似问题