Подтвердить что ты не робот

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

Я хочу получать все события из определенного календаря в моем приложении. Я создал календарь и тестовые события в своем приложении (для создания пользовательских календарей требуется 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

4b9b3361

Ответ 1

Я согласен с тем, что Джеймс тянет слишком много событий с датой, которая до сих пор в будущем не рекомендуется, к счастью, вы можете использовать farFuture, чтобы втянуть, хорошо отдаленные события.

Это, очевидно, не вытягивает все события, кроме как столько событий, сколько возможно, из-за отсутствия памяти или других проблем.

NSDate *endDate = [NSDate distantFuture];

Надеюсь, что поможет

Ответ 2

Как правило, это плохо, чтобы запрашивать такой большой диапазон событий событий из CalendarStore. Производительность ужасно тянет месяц за раз, и вы хотите вытащить "все" ? Определенно не рекомендуется. Пусть CalendarStore будет тем, кто должен беспокоиться о "все" , и вам следует сосредоточиться на том, как правильно охватить диапазоны дат, которые вам нужно потянуть.

Например, если у вас есть обычное приложение для календаря, показывающее месяц за раз, просто снимите 3 месяца (ваш целевой месяц плюс месяц впереди и назад вашего текущего календаря). Если кто-то переместится на следующий месяц, затем выведет запрос, чтобы получить месяц после этого и т.д.

Возможно, вы могли бы предоставить более подробную информацию о том, что заставляет ваше желание получать "все" события?