Получить все события из EventStore EventKit iOS

Я хотел бы знать, как получить все события из 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

как startDate и endDate, ничего хорошего. Так что другие A от других Q не совсем то, что я ищу.

Спасибо!


ИЗМЕНИТЬ

Я протестировал и пришел к выводу, что я могу получать события максимум за 4 года. Есть ли способ пройти через это? Без использования множественных выборок ..


person Nicolas S    schedule 20.05.2011    source источник
comment
Вам нужен список просроченных событий?   -  person Deepak Danduprolu    schedule 21.05.2011
comment
Собственно, каждое событие в календаре. прошлое и будущее.   -  person Nicolas S    schedule 21.05.2011


Ответы (3)


Код для извлечения всех событий в массив:

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];
person Dmitry Soldatenkov    schedule 17.01.2012
comment
Спасибо, Дмитрий! я попробую и вернусь! Никто не мог ответить на этот простой вопрос, будем надеяться, что вы ответили! - person Nicolas S; 17.01.2012
comment
Этот код будет работать, за исключением того, что он объединяет все повторяющиеся события, показывая только последнее возвращенное событие, поскольку он использует eventIdentifier в качестве хэш-ключа, а все повторяющиеся события имеют один и тот же хеш-ключ. if (событие) {[eventsDict setObject: событие forKey: [event.eventIdentifier stringByAppendingString: [описание события.startDate]]]; } - person Tom Meyer; 04.05.2013
comment
Внимание: не в каждом году 365 дней. Так что жесткое кодирование - не лучшее решение. - person Jeroen Noten; 17.11.2014
comment
Вы можете вызвать predicateForEventsWithStartDate в другом потоке. - person Shirish Kumar; 09.03.2015

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

    NSDate *startDate = [NSDate distantPast];       
    NSDate *endDate = [NSDate distantFuture];
person user794543    schedule 16.06.2011
comment
возвращает ли это все прошлые события done? Возвращаются ли все события, если у меня есть события, начинающиеся с 2002 года? - person Nicolas S; 17.06.2011
comment
Я должен был использовать его только на все будущее - person user794543; 17.06.2011
comment
это не будет работать дольше 4 лет, максимум 4 года (в будущем или в прошлом), какие-нибудь идеи? или это сработало для вас таким образом? - person Nicolas S; 19.06.2011
comment
Я ни разу не прошел через 2 года, извините. - person user794543; 19.06.2011
comment
Возможно, когда-то это сработало, но в iOS 9 это не работает. Apple теперь, кажется, ограничивает промежуток между startDate и endDate четырьмя годами. - person Murray Sagal; 14.05.2016

Это код в производстве

const double secondsInAYear = (60.0*60.0*24.0)*365.0;
NSPredicate* predicate = [eventStore predicateForEventsWithStartDate:[NSDate dateWithTimeIntervalSinceNow:-secondsInAYear] endDate:[NSDate dateWithTimeIntervalSinceNow:secondsInAYear] calendars:nil];

Что касается вас, я бы порекомендовал оглянуться на десять лет назад и вперед.

person MrAnonymous    schedule 21.05.2011
comment
проблема в том, что когда я пытаюсь продвинуться дальше одного года, предикат возвращает 0 объектов из магазина. - person Nicolas S; 21.05.2011
comment
Нет, я не пробовал идти дальше - полагаю, магия длится один год. - person MrAnonymous; 16.08.2011
comment
Итак, вы предлагаете выполнить несколько выборок? Мне нужно каждое событие, прошлое и будущее. повторяющиеся или неповторяющиеся и т. д. - person Nicolas S; 16.08.2011
comment
Внимание: не в каждом году 365 дней. Так что жесткое кодирование - не лучшее решение. - person Jeroen Noten; 17.11.2014