Я могу наблюдать CNContactStoreDidChangeNotification, когда база данных контактов изменена, когда приложение находится в фоновом состоянии. Я уверен, что к NSNotificationCenter добавлен только один наблюдатель.
Проблема заключается в NSNotificationCenter сообщениях MULTIPLE раз (2, 3, 5 и даже больше раз), даже если я добавляю только один новый контакт.
Где проблема?
CNContactStoreDidChangeNotification запускается несколько раз
Ответ 1
Убедитесь, что вы не добавляете наблюдателя несколько раз. Это может произойти, если вы не осознаете это, если (например) вы вызываете -addObserver из -viewDidLoad или -viewDidAppear в своем контроллере представления (поскольку они могут вызываться более одного раза в течение всего срока действия вашей заявки) или из любого из обратные вызовы состояния приложения в делегате приложения (-applicationDidBecomeActive, -applicationWillResignActive, -applicationDidEnterBackground, -applicationWillEnterForeground и т.д.).
Оберните вызов -addObserver в условном выражении, который гарантирует, что он может быть вызван только один раз (установить флаг) и поместить в него инструкции NSLog, чтобы вы могли видеть его на консоли отладки, если вы получаете его более одного раза. Найдите свой код для других вызовов -addObserver, о которых вы, возможно, забыли.
Вызовите -removeObserver перед тем, как добавить его, чтобы быть уверенным (удостоверьтесь, что передаете одно и то же имя и объект, как при добавлении его). Вызов -removeObserver на наблюдателя, который не существует, в порядке. Обратите внимание, что это скорее пояснительная помощь, чем исправление. Ваш код должен быть достаточно умным, чтобы знать, уже ли вы его добавили, но это может помочь вам диагностировать проблему.
Я написал небольшую тестовую программу, которая добавляет наблюдателя (один раз!) на CNContactStoreDidChangeNotification, и я получаю уведомление только один раз, когда добавляю или меняю контакт. Напишите аналогичную тестовую программу для себя и посмотрите, получится ли у вас тот же результат. Если ваша тестовая программа работает правильно, то вполне вероятно, что ваше приложение делает то, чего вы не ожидаете (и вызываете -addObserver несколько раз).
Ответ 2
У меня была та же проблема: количество раз, когда она срабатывала, варьировалось от 2 до 3. Решение, которое сработало для меня, заключалось в том, чтобы установить семафорную переменную, установленную в обработчике и reset семафоре по окончании. Оберните обработку адресной книги в инструкции if на семафоре, чтобы игнорировать дальнейшие вызовы. addressBkSemphore reset - false в buildFrendsAndContacts
- (void)addressBkChange:(NSNotification *)note
{
if (addressBkSemphore == false)
{
addressBkSemphore = TRUE;
[self buildFrendsAndContacts];
}
}
Надеюсь, что это поможет.