Agregar evento al calendar muy lento

Simplemente quiero agregar un evento al calendar del dispositivo.

Estoy usando:

__weak ProgramViewController *weakSelf = self; EKEventStore *store = [[EKEventStore alloc] init]; [store requestAccessToEntityType:EKEntityTypeEvent completion:^(BOOL granted, NSError *error) { if (error) NSLog(@"EKEventStore error = %@", error); if (granted) { NSLog(@"EKEvent *event "); EKEvent *event = [EKEvent eventWithEventStore:store]; event.title = weakSelf.program.title; event.location = weakSelf.program.locationPublic; event.startDate = weakSelf.program.startTime; event.endDate = weakSelf.program.endTime; [event setCalendar:[store defaultCalendarForNewEvents]]; NSError *err = nil; [store saveEvent:event span:EKSpanThisEvent commit:YES error:&err]; if (err) { UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Calendar Error" message:err.localizedDescription delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil]; [alertView show]; } else { UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Added" message:@"Calendar event added." delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil]; [alertView show]; } } }]; 

y en iOS 6 puede tardar 6/7 segundos (iPhone 4) y en iOS 7 (en un iPhone 5S) toma ~ 10 segundos. ¿Es este comportamiento normal? Si no, ¿qué estoy haciendo mal?

Tuve el mismo problema. Gracias a la respuesta de Jasper, pensé en las queues. Prueba esto:

  if (!err) { dispatch_async(dispatch_get_main_queue(), ^{ [[[UIAlertView alloc] initWithTitle:NSLocalizedString(@"event added", nil) message:nil delegate:nil cancelButtonTitle:NSLocalizedString(@"ok", nil) otherButtonTitles:nil] show]; }); } 

Aquí es por qué se necesita esto (ver énfasis)

Discusión

En iOS 6 y versiones posteriores, solicitar acceso a una tienda de events de manera asíncrona le solicita a sus usuarios permiso para usar sus datos. El usuario solo se le solicita la primera vez que su aplicación solicita acceso a un tipo de entidad; cualquier instanciación posterior de EKEventStore utiliza los permissions existentes. Cuando el usuario selecciona otorgar o denegar el acceso, se llamará al manejador de finalización en una queue arbitraria. Su aplicación no está bloqueada mientras el usuario decide otorgar o denegar el permiso.

Como UIAlertView es UIKit, y UIKit siempre requiere el hilo principal, cualquier otro hilo arbitrario se bloqueará o conducirá a un comportamiento impnetworkingecible.

https://developer.apple.com/library/ios/documentation/EventKit/Reference/EKEventStoreClassRef/Reference/Reference.html

De acuerdo con los documentos: "Un object EKEventStore requiere una cantidad de time relativamente larga para inicializar y liberar". . . por lo que debería enviar esto en una queue de background.

Además, curiosamente, lleva más time en la queue principal que en la queue de background, ¡no estoy seguro de por qué es así!