EKEventStore при получении событий возвращает пустой список

Я хочу получать все события из определенного календаря в своем приложении. Я создал календарь и тестовые события в своем приложении (требуется iOS 5.0 или более поздняя версия для создания пользовательских календарей). Если я запускаю приложение на своем устройстве, а затем проверяю приложение системного календаря, мой календарь и созданные мной события отображаются правильно.

Теперь я хочу, чтобы мое приложение считывало все эти события из этого пользовательского календаря. Мои события создаются с параметрами startDate и endDate, установленными в NOW (NSDate, выделенные без указания timeInterval).

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];
NSPredicate *datePredicate = [store predicateForEventsWithStartDate:startDate endDate:endDate calendars:calendarList];
NSArray *eventList = [store eventsMatchingPredicate:datePredicate];

Как видите, я указываю временной интервал, в котором должны быть результирующие события. Как видите, конечная дата — через 25 лет, а начальная — через 4 года (плюс один день для високосного года)в прошлом. Если я таким образом запрашиваю EKEventstore, я получаю ранее добавленные события. Сложность начинается, если я хочу поместить дату начала на один (или более дней или лет)назад. Затем внезапно никакие события не возвращаются.

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

Существует ли ограничение на отрицательные значения NSTimeInterval в NSPredicate? Я не нашел каких-либо документированных ограничений. Мне потребовалось около 2 часов, чтобы определить, почему я не получал никаких событий (изначально я хотел получить диапазон в 5 лет в прошлом и 5 лет в будущем). В чем причина такого любопытного поведения? Любая идея?

/редактирование от 11.04.2012 После создания некоторых событий с датой начала 31.03.2012 и 20.04.2012 кажется, что выборка событий по датам, определенным с интервалами от настоящего момента, ограничена длиной интервала в 4 года. Скорректировав дату начала (, установив день начала на день раньше )в приведенном выше коде, я смог получить события до 31.03.2012, но не позже.Удаление этой корректировки привело к получению событий от 31.03.2012 и 01.04.2012 (, но не от 20.04.2012). После второй корректировки (установки даты начала на 20 дней позже)я получил даже эти будущие события.
Я не могу указать, почему существует такое ограничение. Возможно, есть какие-то внутренние вычисления, которые приведут к переполнению используемого хранилища значений. Просто предположение.

Затем я перехожу к Apple примерам. На первый взгляд, я не хотел использовать данный код в Руководстве по программированию EKEvent от Apple. Он не выглядел таким маленьким и милым, как мой, но после стольких хлопот я попробовал.

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);

Таким образом я получаю все события, начиная с 01.04.2008 по СЕЙЧАС()+ 1 год. Что ж, оказалось, что здесь используется то же ограничение :(. Корректировка даты начала привела к получению только части моих событий, пока последние события не оказались в диапазоне этих 4 лет.

Интенсивные исследования показали, что такое поведение существует уже очень давно.:Извлекать все события из EventStore EventKit iOS

13
задан Community 23 May 2017 в 11:52
поделиться