CNContactStoreDidChangeNotification se dispara varias veces

Puedo observar el CNContactStoreDidChangeNotification cuando la database de contacto se cambia mientras la aplicación está en estado de background. Estoy bastante seguro de que solo un observador se agregó a NSNotificationCenter . El problema es que NSNotificationCenter publica MÚLTIPLES veces (2, 3, 5 e incluso más veces) incluso si solo agrego un nuevo contacto. ¿Dónde está el problema?

Asegúrese de no agregar el observador varias veces. Esto puede suceder sin que se dé count si (por ejemplo) llama -addObserver desde -viewDidLoad o -viewDidAppear en su controller de vista (ya que estos pueden recibir llamadas más de una vez durante la vida útil de su aplicación) o desde cualquier estado de la aplicación devoluciones de llamada en su delegado de la aplicación ( -applicationDidBecomeActive , -applicationWillResignActive , -applicationDidEnterBackground , -applicationWillEnterForeground , etc.).

Envuelva la llamada a -addObserver en un condicional que garantice que solo se puede llamar una vez (establezca un indicador) y coloque sentencias NSLog a su alnetworkingedor para que pueda ver en la console de debugging si está llegando allí más de una vez. Busque en su código otras llamadas a -addObserver que pueda haber olvidado.

Llame -removeObserver antes de agregarlo, solo para estar seguro (asegúrese de pasar el mismo nombre y el mismo object que cuando lo agregó). Llamar a -removeObserver a un observador que no existe está bien. Tenga en count que esto es más una ayuda de banda que una solución, su código debería ser lo suficientemente inteligente como para saber si ya lo ha agregado o no, pero esto podría ayudarlo a diagnosticar el problema).

Acabo de escribir un progtwig de testing mínimo rápido que agrega un observador (¡una vez!) En CNContactStoreDidChangeNotification y solo recibo la notificación una vez cuando agrego o cambio un contacto. Escribe un progtwig de testing similar para ti y mira si obtienes el mismo resultado. Si su progtwig de testing funciona correctamente, es probable que su aplicación esté haciendo algo que no espera (y llamando -addObserver varias veces).

Tuve el mismo problema, el número de disparos varió entre 2 y 3. La solución que funcionó para mí fue establecer una variable de semáforo, configurarla en el manejador y restablecer el semáforo cuando termine. Ajustar el procesamiento de la libreta de direcciones en una instrucción if en el semáforo para ignorar otras llamadas. addressBkSemphore se restablece a false en buildFrendsAndContacts

 - (void)addressBkChange:(NSNotification *)note { if (addressBkSemphore == false) { addressBkSemphore = TRUE; [self buildFrendsAndContacts]; } } 

Espero eso ayude.