EKEventStore get events devuelve la list vacía

Quiero get todos los events de un calendar específico en mi aplicación. Creé el calendar y los events de testing en mi aplicación (necesita iOS 5.0 o posterior para crear calendars personalizados). Si ejecuto la aplicación en mi dispositivo y luego verifico la aplicación del calendar del sistema, mi calendar y mis events creados se muestran correctamente.

Ahora quiero que mi aplicación lea todos esos events de este calendar personalizado. Mis events se crean con startDate y endDate configurados en NOW (NSDate asignado sin timeInterval dado).

NSDate *startDate = [NSDate dateWithTimeIntervalSinceNow:- 60 * 60 * 24 * (365 * 4 + 1)]; NSDate *endDate = [NSDate dateWithTimeIntervalSinceNow:60 * 60 * 24 * 365 * 25]; NSArray *calendarList = [NSArray arrayWithObjects:tmpCal, nil]; NSPnetworkingicate *datePnetworkingicate = [store pnetworkingicateForEventsWithStartDate:startDate endDate:endDate calendars:calendarList]; NSArray *eventList = [store eventsMatchingPnetworkingicate:datePnetworkingicate]; 

Como puede ver, estoy especificando un intervalo de time en el que los events resultantes deben ser. Como puede ver también, la date de finalización será en 25 años a partir de ahora, mientras que la date de inicio es de 4 años (más un día para el año bisiesto) en el pasado. Si hago una consulta al EKEventstore de esta manera, obtengo los events agregados previamente. La parte difícil comienza si quiero poner la date de inicio una (o más días o años) en el pasado. Entonces, de repente, no se devuelve ningún evento.

 NSDate *startDate = [NSDate dateWithTimeIntervalSinceNow:- 60 * 60 * 24 * (365 * 4 + 2)]; 

¿Hay un límite para los valores negativos de un NSTimeInterval en un NSPnetworkingicate? No encontré ninguna limitación documentada. Me tomó aproximadamente 2 horas para detectar por qué no recibía ningún evento (originalmente quería un range de 5 años en el pasado y 5 años en el futuro). ¿Cuál es la razón de este curioso comportamiento? ¿Alguna idea?

/ editar el 11/04/2012 Después de crear algunos events con una date de inicio el 31/03/2012 y el 20/04/2012, parece ser que search events por dates determinado con intervalos a partir de ahora está limitado por una longitud de intervalo de 4 años. Ajustando mi date de inicio (configurando el día de inicio un día antes) en el código anterior, pude get events hasta el 31/03/2012 pero no más tarde. Al eliminar este ajuste, se obtuvieron events del 31/03/2012 y 04/01/2012 (pero no los del 20/04/2012). Después de un segundo ajuste (configurando la date de inicio 20 días después) obtuve incluso esos events futuros.
No puedo especificar por qué hay tal limitación. Puede haber algunos cálculos internos que llevarían a desbordamientos del almacenamiento de valores usados. Solo una suposition.

Luego me dirijo a los ejemplos de Apple . A primera vista, no quería usar el código dado en la Guía de progtwigción de EKEvent de Apple. No se veía tan pequeño y lindo como el mío, pero después de tener tantos problemas lo intenté.

 CFGregorianDate gregorianStartDate, gregorianEndDate; CFTimeZoneRef timeZone = CFTimeZoneCopySystem(); gregorianStartDate.hour = 0; gregorianStartDate.minute = 0; gregorianStartDate.second = 0; gregorianStartDate.day = 1; gregorianStartDate.month = 4; gregorianStartDate.year = 2008; NSDateComponents *components = [[NSCalendar currentCalendar] components:NSDayCalendarUnit | NSMonthCalendarUnit | NSYearCalendarUnit fromDate:[NSDate date]]; gregorianEndDate.hour = 23; gregorianEndDate.minute = 59; gregorianEndDate.second = 59; gregorianEndDate.day = [components day]; gregorianEndDate.month = [components month]; gregorianEndDate.year = [components year] + 1; NSDate *startDate = [NSDate dateWithTimeIntervalSinceReferenceDate:CFGregorianDateGetAbsoluteTime(gregorianStartDate, timeZone)]; NSDate *endDate = [NSDate dateWithTimeIntervalSinceReferenceDate:CFGregorianDateGetAbsoluteTime(gregorianEndDate, timeZone)]; CFRelease(timeZone); 

De esta manera obtengo todos los events a partir del 04/01/2008 hasta AHORA () + 1 año. Bueno, resultó que se usa la misma limitación aquí 🙁 Ajustar la date de inicio resultó en get solo una parte de mis events hasta que los últimos events estuvieron en el range de esos 4 años.

Las investigaciones intensivas mostraron que este comportamiento existe mucho time: Obtenga todos los events de EventStore EventKit iOS

Estoy de acuerdo con que James no ha aconsejado demasiados events con una date tan lejana en el futuro, por suerte puede usar el Futuro distante para realizar events muy lejanos.

Obviamente, esto no provoca todos los events, sino tantos events como sea posible, sin causar problemas de memory u otros.

 NSDate *endDate = [NSDate distantFuture]; 

Espero que ayude

Por lo general, es una mala cosa consultar un range de events de gran tamaño en CalendarStore. El performance es horrible tirando un mes a la vez, ¿y quieres tirar "todo"? Definitivamente no aconsejado. Deje que CalendarStore sea el que tiene que preocuparse por 'todo', y debe concentrarse en cómo lograr el scope adecuado de los ranges de dates que necesita para get.

Por ejemplo, si tiene una aplicación de calendar normal que muestra un mes a la vez, simplemente disminuya 3 meses (su mes objective, más el mes anterior y posterior de su calendar actual). Si alguien accede al mes siguiente, luego pida una request para get el mes siguiente y así sucesivamente.

Tal vez pueda proporcionar más información sobre qué está impulsando su deseo de get 'todos' events?