Esto es el resultado de cómo exactamente se envían las notificaciones y de lo que cada uno realmente está notificando. En mi experiencia, puede esperar recibir al menos una notificación para un cambio en un artículo (evento, recordatorio, etc.) y al menos uno más para el cambio resultante al calendario que lo contiene.
Sin ver su código y saber qué cambios se están realizando, no puedo ser demasiado específico acerca de una respuesta; sin embargo, en general, tienes dos opciones.
- Observe los cambios más de cerca: quizás pueda ignorar algunas notificaciones si se trata de eventos que no pertenecen a su aplicación, o si ya ha manejado un cambio para un artículo en particular.
- Coalesce múltiples cambios en un solo lote de código de controlador. Básicamente, cuando recibe la notificación, en lugar de iniciar su respuesta de inmediato, inicie un temporizador que ejecutará la respuesta en uno o dos segundos. Luego, si recibe otra notificación antes de que se dispare el temporizador, puede cancelar el temporizador y reiniciarlo. De esta forma, puede agrupar varias notificaciones que vienen en una ventana de tiempo corto y solo responder una vez (cuando el temporizador se dispara).
Esta última solución es mi respuesta preferida, y podría ser algo como (ignorando temporalmente preocupaciones de enhebrado):
@property (strong) NSTimer *handlerTimer;
- (void)handleNotification:(NSNotification *)note {
// This is the function that gets called on EKEventStoreChangedNotifications
[self.handlerTimer invalidate];
self.handlerTimer = [NSTimer timerWithTimeInterval:2.0
target:self
selector:@selector(respond)
userInfo:nil
repeats:NO];
[[NSRunLoop mainRunLoop] addTimer:self.handlerTimer
forMode:NSDefaultRunLoopMode];
}
- (void)respond {
[self.handlerTimer invalidate];
NSLog(@"Here's where you actually respond to the event changes");
}
Sólo una rápida gracias, y una retroalimentación: con iOS 8.4.1 el comportamiento que notado (al menos 2 notificaciones disparadas por cada cambio) sigue siendo muy cierto y tu n. 2 solución funcionó maravillosamente para mí; No estoy seguro de la solución n. 1 podría aplicarse a EKEventStoreChangedNotification, ya que estas notificaciones no describen qué cambios se produjeron en EKEventStore. Entonces, solución n. 2 es el camino a seguir! – cdf1982
Tengo el mismo problema en iOS9 –