2012-08-30 25 views
8

Estoy usando EKEventStore en mi aplicación. Agarro la tienda por defecto y me registro para el EKEventStoreChangedNotification para recibir una notificación cuando se realizan cambios en el calendario. Sin embargo, cuando se realiza un cambio, el remitente de la notificación se llama varias (5-10) veces, a veces con hasta 15 segundos entre cada llamada. Esto arruina mi código y hace que sea mucho más difícil trabajar con él. ¿Hay algo que pueda hacer al respecto?EKEventStoreChangedNotification se llama varias veces

Gracias

iOS7 EDIT: Parece que a partir de la liberación de iOS7, este problema ha desaparecido. Ahora, independientemente del cambio realizado en CalendarStore, solo se envía un EKEventStoreChangedNotification.

Respuesta

16

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.

  1. 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.
  2. 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"); 
} 
+1

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

+0

Tengo el mismo problema en iOS9 –

Cuestiones relacionadas