ios – EKEventStore获取事件返回空列表

前端之家收集整理的这篇文章主要介绍了ios – EKEventStore获取事件返回空列表前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我想从我的应用程序中的特定日历中获取所有活动.我在我的应用程序中创建了日历和测试事件(需要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)];

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

希望有帮助

猜你在找的iOS相关文章