从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;
}

正确的应该使用NSPredcate,它是用创建的

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

我试过使用

distantPast
distantFuture

作为startDate和endDate,不好。所以其他Q中的其他A并不是我想要的。

谢谢!


编辑

我已经测试并得出结论,我最多只能在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];

对你来说,我建议你回顾和展望十年。

相关内容

  • 没有找到相关文章

最新更新