ios swift nsnotificationcenter cncontact cncontactstore

ios - CNContactStoreDidChangeNotification se dispara varias veces



swift nsnotificationcenter (3)

Asegúrese de que no está agregando el observador varias veces. Esto puede suceder sin que usted se dé cuenta si (por ejemplo) llama a -addObserver desde -viewDidLoad o -viewDidAppear en su controlador de vista (ya que estos pueden ser llamados más de una vez a lo largo de la vida de su aplicación), o desde cualquiera de los estados de la aplicación. devoluciones de llamada en su delegado de aplicación ( -applicationDidBecomeActive , -applicationWillResignActive , -applicationDidEnterBackground , -applicationWillEnterForeground , etc.).

Envuelva la llamada a -addObserver en un condicional que garantice que solo se pueda llamar una vez (establecer un indicador), y coloque las declaraciones de NSLog alrededor para que pueda ver en la consola de depuración si llega más de una vez. Busca en tu código otras llamadas a -addObserver que podrías haber olvidado.

Llame a -removeObserver antes de agregarlo, solo para estar seguro (asegúrese de pasar el mismo nombre y objeto que cuando lo agregó). -removeObserver llamar a -removeObserver en un observador que no existe. Tenga en cuenta que esto es más una curita 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 programa de prueba 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. Escriba un programa de prueba similar para usted mismo y vea si obtiene el mismo resultado. Si su programa de prueba funciona correctamente, es probable que su aplicación esté haciendo algo que no espera (y llama a -addObserver varias veces).

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


Puede iniciar un temporizador de ejecución de una sola vez o un envío después de unos segundos y cancelarlo en caso de que haya una nueva actualización de contactos dentro de esos segundos, asegurando así que solo se ejecutará el temporizador o dispatch_after activado por la última actualización (teniendo en cuenta que todos las llamadas de actualización se suceden una tras otra dentro de una diferencia de segundo, en la medida en que lo probé)

Y por cierto, podría reproducir el problema solo al cambiar los contactos en el mismo dispositivo con mi aplicación. Si cambio los contactos en otro dispositivo vinculado a la misma cuenta de Apple, solo había una actualización.


Tuve el mismo problema, la cantidad de veces que se disparó varió entre 2 y 3. La solución que funcionó para mí fue establecer una variable de semáforo, configurada en el controlador y restablecer el semáforo cuando termine. Envuelva el procesamiento de la libreta de direcciones en una instrucción if en el semáforo para ignorar las llamadas posteriores. addressBkSemphore se restablece en falso en buildFrendsAndContacts

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

Espero eso ayude.