我想在我的应用程序中从一个特定的日历中获取所有事件。我在我的应用程序中创建了日历和测试事件(创建自定义日历需要iOS 5.0或更高版本)。如果我在我的设备上运行应用程序,然后检查系统日历应用程序,那么我的日历和我创建的事件将正确显示。
现在,我想让我的应用程序从这个自定义日历中读取所有这些事件。我的事件是用startDate和endDate设置为NOW来创建的(NSDate分配了没有指定的timeInterval )。
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年的未来)。这种奇怪行为的原因是什么?有什么想法吗?
/edit于2012年11月04/11创建了一些活动,开始日期分别为03/31/2012和04/20/2012,从现在起,按间隔确定的日期提取事件的间隔时间限制为4年。在上面给定的代码中调整我的开始日期(通过提前一天设置开始日期),我能够在03/31/2012之前得到事件,但不能在以后得到事件。取消这一调整导致从2012年3月31日和2012年4月1日(但不是从04/20/2012年度起)发生事件。经过第二次调整(设定20天后的开始日期),我甚至得到了那些未来的事件。
我不能具体说明为何会有这样的限制。可能有一些内部计算会导致使用价值存储溢出。只是猜一下。
然后我来看看苹果的例子。乍一看,我不想在苹果的EKEvent编程指南中使用给定的代码。它看上去没有我的小可爱,但在遇到这么多麻烦后,我试了一试。
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到现在()+1年的所有事件。实际上,这里也使用了同样的限制:(调整开始日期只得到了我的一部分事件,直到最后一个事件在这4年的范围内。)
大量研究表明,这种行为存在很长时间:Fetch all events from EventStore EventKit iOS。
发布于 2014-07-17 08:14:11
我同意詹姆斯把太多的事件和未来的日期联系在一起是不建议的,幸运的是,你可以使用distantFuture来完成一些遥远的事情。
显然,这并不能拉动所有事件,而是尽可能多的事件,而不会导致内存或其他问题。
NSDate *endDate = [NSDate distantFuture];希望这有帮助
发布于 2013-01-25 20:57:22
从CalendarStore查询如此大的日期范围的事件通常是件坏事。表演是可怕的拉一个月一次,而你想要“全部”?绝对不建议。让CalendarStore成为一个必须担心“全部”的人,并且您应该关注如何正确地调整您需要拉出的日期范围。
例如,如果您有一个正常的日历应用程序一次显示一个月,只需向下拉3个月(目标月份,加上当前日历前后的月份)。如果有人呼到下一个月,然后提出一个请求,以得到这个月后,等等。
也许你可以提供更多的信息,是什么驱动了你的愿望得到‘所有’事件?
https://stackoverflow.com/questions/9988843
复制相似问题