Я хочу получать все события из определенного календаря в моем приложении. Я создал календарь и тестовые события в своем приложении (для создания пользовательских календарей требуется iOS 5.0 или новее). Если я запустил приложение на своем устройстве и затем проверил приложение системного календаря, то мой календарь и мои созданные события будут показаны правильно.
Теперь я хочу, чтобы мое приложение прочитало все эти события из этого настраиваемого календаря. Мои события создаются с параметрами startDate и endDate, установленными в значение "СЕЙЧАС" (NSDate распределяется без указания времениInterval).
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 лет в будущем). В чем причина этого любопытного поведения? Любая идея?
/изменить на 04/11/2012
После создания некоторых событий со стартовой датой 03/31/2012 и 04/20/2012 кажется, что выборка событий по датам, определенным с интервалами с этого времени, ограничена интервалом в 4 года. Корректируя дату начала (задав начальный день на один день раньше) в указанном выше коде, я смог получить события до 31 марта 2012 года, но не позже. Удаление этой корректировки привело к получению событий с 03/31/2012 и 04/01/2012 (но не с 04/20/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);
Таким образом, я получаю все события, начиная с 04/01/2008 до NOW() + 1 год. Ну, оказалось, что здесь используются те же ограничения:( Корректировка даты начала привела к тому, что я получал только часть своих событий до тех пор, пока последние события не были в пределах этих четырех лет.
Интенсивные исследования показали, что такое поведение существует очень долго: Получить все события из EventStore EventKit iOS