Ответ 1
Убедитесь, что вы не добавляете наблюдателя несколько раз. Это может произойти, если вы не осознаете это, если (например) вы вызываете -addObserver
из -viewDidLoad
или -viewDidAppear
в своем контроллере представления (поскольку они могут вызываться более одного раза в течение всего срока действия вашей заявки) или из любого из обратные вызовы состояния приложения в делегате приложения (-applicationDidBecomeActive
, -applicationWillResignActive
, -applicationDidEnterBackground
, -applicationWillEnterForeground
и т.д.).
Оберните вызов -addObserver
в условном выражении, который гарантирует, что он может быть вызван только один раз (установить флаг) и поместить в него инструкции NSLog, чтобы вы могли видеть его на консоли отладки, если вы получаете его более одного раза. Найдите свой код для других вызовов -addObserver
, о которых вы, возможно, забыли.
Вызовите -removeObserver
перед тем, как добавить его, чтобы быть уверенным (удостоверьтесь, что передаете одно и то же имя и объект, как при добавлении его). Вызов -removeObserver
на наблюдателя, который не существует, в порядке. Обратите внимание, что это скорее пояснительная помощь, чем исправление. Ваш код должен быть достаточно умным, чтобы знать, уже ли вы его добавили, но это может помочь вам диагностировать проблему.
Я написал небольшую тестовую программу, которая добавляет наблюдателя (один раз!) на CNContactStoreDidChangeNotification
, и я получаю уведомление только один раз, когда добавляю или меняю контакт. Напишите аналогичную тестовую программу для себя и посмотрите, получится ли у вас тот же результат. Если ваша тестовая программа работает правильно, то вполне вероятно, что ваше приложение делает то, чего вы не ожидаете (и вызываете -addObserver
несколько раз).