Contents

很早就有人在 coding.net 给我提了 issue 说应用没法儿同步系统日历中的未来的部分,本来一开始以为是跟后台的交互中出错导致的特殊现象,但是当我小心翼翼跟进查看时发现没这么简单。
获取 iOS 系统日历方法怎么样我就不写了,核心部分(出现异常的版本):

NSDate *startDate = [NSDate dateWithTimeIntervalSinceNow:-1 * 3600 * 24 * 365 * 4];
NSDate *endDate   = [NSDate dateWithTimeIntervalSinceNow:1 * 3600 * 24 * 365 * 4];
NSPredicate *predicate = [eventStore predicateForEventsWithStartDate:startDate
                                                             endDate:endDate
                                                           calendars:nil];
NSArray *systemEvents = [eventStore eventsMatchingPredicate:predicate];

这样写的结果就是无法获得未来的日历,超过今天一天都不行。一开始把注意力放在 startDate 和 endDate 的构造上,看到 Apple Guide 里用的是 NSDateComponents 来构造的 NSDate 我也改用 NSDateComponents,依然不行。

通过下载 Apple 官方 EventKit 相关的 Demo project 在其基础上修改测试最终才发现问题所在。

原来是 predicateForEventsWithStartDate 函数的问题

考虑到性能的问题,只选取四年的范围。

相关 Guide 说明

非常遗憾的是这个 discussion 没有出现在 Apple 的在线 Class Reference 中,让我研究了好久,Stack Overflow 也没看到。
相关的 2012 WWDC 304 session 也没有提到过这个问题。

但是还有一个问题,OS X only ?
为什么是仅限于 OS X ?明明我在 iOS 上出现了这个问题,谈及性能不应该更加顾虑的是 iOS 吗?
于是我给 Apple 报了一个 radar 25260094.




Contents