现在我想让我的应用程序读取这个自定义日历中的所有事件.我的事件是用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)];
在NSPredicate中NSTimeInterval的负值是否有限制?我没有发现任何文件限制.我花了大约2个小时才察觉到为什么我没有收到任何事情(原来我想要过去5年的时间以及未来5年的时间).这个好奇的行为是什么原因?任何想法?
/编辑04/11/2012
在03/31/2012和04/20/2012的开始日期创建一些事件之后,似乎是按照从现在开始的时间间隔来确定日期的事件受到4年间隔的限制.在上面的给定代码中调整我的开始日期(通过设置前一天的开始日期),我可以获得事件,直到2012年3月31日,但不能晚些.删除此调整导致从03/31/2012和04/01/2012(但不是04/20/2012)的事件.经过二次调整(设定20天后的开始日期),我甚至还有未来的事件.
我不能指定为什么会有这样的限制.可能有一些内部计算将导致使用值存储的溢出.只是一个猜测
然后我来到苹果的例子.乍一看,我不想在Apple的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开始到NOW()1年.那么事实证明,这里使用了同样的限制:(调整开始日期导致只有一部分事件,直到最后的事件在这4年的范围内.
深入研究表明,这种行为存在很长时间:Fetch all events from EventStore EventKit iOS
解决方法
这显然不会拉动所有的事件,而是尽可能多地发生事件,导致内存或其他问题.
NSDate *endDate = [NSDate distantFuture];
希望有帮助