Подтвердить что ты не робот

CNContactStoreDidChangeNotification запускается несколько раз

Я могу наблюдать CNContactStoreDidChangeNotification, когда база данных контактов изменена, когда приложение находится в фоновом состоянии. Я уверен, что к NSNotificationCenter добавлен только один наблюдатель. Проблема заключается в NSNotificationCenter сообщениях MULTIPLE раз (2, 3, 5 и даже больше раз), даже если я добавляю только один новый контакт. Где проблема?

4b9b3361

Ответ 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];
    }
}

Надеюсь, что это поможет.