Я могу наблюдать 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];
}
}
Надеюсь, что это поможет.