#iphone #ios #sdk #fetch #eventkit
#iPhone #iOS #sdk #извлекать #eventkit
Вопрос:
я хотел бы знать, как извлекать все события из EventStore с помощью EventKit в iOS.
Таким образом, я могу указать все события на сегодня:
- (NSArray *)fetchEventsForToday {
NSDate *startDate = [NSDate date];
// endDate is 1 day = 60*60*24 seconds = 86400 seconds from startDate
NSDate *endDate = [NSDate dateWithTimeIntervalSinceNow:86400];
// Create the predicate. Pass it the default calendar.
NSArray *calendarArray = [NSArray arrayWithObject:defaultCalendar];
NSPredicate *predicate = [self.eventStore predicateForEventsWithStartDate:startDate endDate:endDate calendars:calendarArray];
// Fetch all events that match the predicate.
NSArray *events = [self.eventStore eventsMatchingPredicate:predicate];
return events;
}
Правильный должен использовать NSPredicate, который создается с:
NSPredicate *predicate = [self.eventStore predicateForEventsWithStartDate:startDate endDate:endDate calendars:calendarArray];
Я пытался использовать
distantPast
distantFuture
как дата начала, так и дата окончания, ничего хорошего.
Таким образом, другие A из других Q — это не совсем то, что я ищу.
Спасибо!
Редактировать
Я протестировал и пришел к выводу, что могу извлекать события максимум за 4 года. Есть какой-нибудь способ обойти это? Без использования нескольких выборок..
Комментарии:
1. Вам нужен список событий с истекшим сроком действия?
2. Точно, каждое событие в календаре. прошлое и будущее.
Ответ №1:
Код для извлечения всех событий в массив :
NSDate *start = ...
NSDate *finish = ...
// use Dictionary for remove duplicates produced by events covered more one year segment
NSMutableDictionary *eventsDict = [NSMutableDictionary dictionaryWithCapacity:1024];
NSDate* currentStart = [NSDate dateWithTimeInterval:0 sinceDate:start];
int seconds_in_year = 60*60*24*365;
// enumerate events by one year segment because iOS do not support predicate longer than 4 year !
while ([currentStart compare:finish] == NSOrderedAscending) {
NSDate* currentFinish = [NSDate dateWithTimeInterval:seconds_in_year sinceDate:currentStart];
if ([currentFinish compare:finish] == NSOrderedDescending) {
currentFinish = [NSDate dateWithTimeInterval:0 sinceDate:finish];
}
NSPredicate *predicate = [eventStore predicateForEventsWithStartDate:currentStart endDate:currentFinish calendars:nil];
[eventStore enumerateEventsMatchingPredicate:predicate
usingBlock:^(EKEvent *event, BOOL *stop) {
if (event) {
[eventsDict setObject:event forKey:event.eventIdentifier];
}
}];
currentStart = [NSDate dateWithTimeInterval:(seconds_in_year 1) sinceDate:currentStart];
}
NSArray *events = [eventsDict allValues];
Комментарии:
1. Спасибо, Дмитрий! я попробую это и вернусь! Никто не смог ответить на этот простой вопрос, будем надеяться, что вы смогли!
2. Этот код будет работать, за исключением того, что он объединяет все повторяющиеся события, показывая только возвращенное окончательное событие, поскольку в качестве хэш-ключа используется eventIdentifier, а все повторяющиеся события имеют один и тот же хэш-ключ. if (событие) { [eventsDict setObject:event forKey:[event.eventIdentifier stringByAppendingString:[описание события.StartDate]]]; }
3. Будьте осторожны: не в каждом году 365 дней.. Итак, жесткое кодирование — это не лучшее решение.
4. Возможно, вы захотите вызвать predicateForEventsWithStartDate в другом потоке.
Ответ №2:
Это метод, который я использую в своем приложении для их извлечения.
NSDate *startDate = [NSDate distantPast];
NSDate *endDate = [NSDate distantFuture];
Комментарии:
1. возвращает ли это все прошлые «выполненные» события? Возвращает ли это все события, если у меня есть события, начинающиеся с 2002 года?
2. Я должен был использовать это только для всего будущего
3. это не будет работать дольше, чем через 4 года, максимум за 4-летний период (в будущем или прошлом), есть идеи? или у вас это сработало таким образом?
4. Я никогда не заходил за последние 2 года, извините.
5. Возможно, когда-то это работало, но в iOS 9 это не работает. Похоже, что Apple теперь ограничивает интервал между
startDate
иendDate
4 годами.
Ответ №3:
Это рабочий код
const double secondsInAYear = (60.0*60.0*24.0)*365.0;
NSPredicate* predicate = [eventStore predicateForEventsWithStartDate:[NSDate dateWithTimeIntervalSinceNow:-secondsInAYear] endDate:[NSDate dateWithTimeIntervalSinceNow:secondsInAYear] calendars:nil];
Для вас я бы порекомендовал оглянуться назад и вперед на десять лет.
Комментарии:
1. проблема в том, что когда я пытаюсь перейти дальше, чем на один год, предикат возвращает 0 объектов из хранилища.
2. Нет, я не пробовал идти дальше — я думаю, волшебство заключается в одном году.
3. Итак, вы предлагаете выполнять несколько выборок? Мне нужны все события, прошлые и будущие. повторяющиеся или не повторяющиеся и т.д.
4. Будьте осторожны: не в каждом году 365 дней.. Итак, жесткое кодирование — это не лучшее решение.