从EventStore EventKit iOS获取所有事件

我想知道如何在iOS中使用EventKit从EventStore获取所有事件。

这样我可以指定今天的所有事件:

- (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,它是通过以下方式创build的:

 NSPredicate *predicate = [self.eventStore predicateForEventsWithStartDate:startDate endDate:endDate calendars:calendarArray]; 

我曾尝试使用

 distantPast distantFuture 

作为startDate和endDate,不行。 所以其他Q的其他A也不是我所期待的。

谢谢!


编辑

我已经testing并得出结论,我只能在4年的时间内取得事件最多。 任何方式越过这个? 不使用多个提取..

将所有事件提取到数组中的代码:

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

这是我在我的应用程序中获取它们的方法。

  NSDate *startDate = [NSDate distantPast]; NSDate *endDate = [NSDate distantFuture]; 

这是生产中的代码

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

对于你,我会build议回头看十年。