iOS:predicateForEventsWithStartDate 不会 return 在搜索框外开始的事件
iOS: predicateForEventsWithStartDate does not return events starting outside of search frame
我在下面代码片段中使用的简单示例:
搜索框:2016 年 4 月 15 日15:00pm-18:00pm
在日历中输入的事件:
- 事件 1:2016 年 4 月 15 日 12:00pm-16:00pm
- 事件 2:2016 年 4 月 15 日 17:00pm-20:00pm
现在使用的方法 returns 我只有一个对象 - 即事件 2。显然我希望同时返回 - 事件 1 和 2。
真不明白为什么会这样!我的代码中遗漏了什么?提前致谢。
int seconds_in_year = 60*60*24*365;
__block
NSDate* currentStart = [NSDate dateWithTimeInterval:0 sinceDate:startTime];
__block
NSDate* currentFinish = [NSDate dateWithTimeInterval:seconds_in_year sinceDate:currentStart];
// use Dictionary for remove duplicates produced by events covered more one year segment
NSMutableDictionary *eventsDict = [NSMutableDictionary dictionaryWithCapacity:1024];
EKEventStore *store = [[EKEventStore alloc] init];
[store requestAccessToEntityType:EKEntityTypeEvent completion:^(BOOL granted, NSError *error) {
if (!granted) { return; }
// enumerate events by one year segment because iOS do not support predicate longer than 4 year !
while ([currentStart compare:endTime] == NSOrderedAscending) {
if ([currentFinish compare:endTime] == NSOrderedDescending) {
currentFinish = [NSDate dateWithTimeInterval:0 sinceDate:endTime];
}
NSPredicate *predicate = [store predicateForEventsWithStartDate:currentStart endDate:currentFinish calendars:nil];
[store enumerateEventsMatchingPredicate:predicate
usingBlock:^(EKEvent *event, BOOL *stop) {
if (event) {
[eventsDict setObject:event forKey:event.eventIdentifier];
}
}];
currentStart = [NSDate dateWithTimeInterval:(seconds_in_year + 1) sinceDate:currentStart];
}
return;
}];
编辑:
如果我尝试另一个事件 3(2016 年 4 月 15 日 14:00pm-19:00pm),那么方法 returns 我整个搜索期间都是日历中的 "event" .相对于之前的情况还是挺头疼的。
如方法名称所示 predicateForEventsWithStartDate 搜索等于或晚于传递日期的 startDate
s参数。
我在下面代码片段中使用的简单示例:
搜索框:2016 年 4 月 15 日15:00pm-18:00pm
在日历中输入的事件:
- 事件 1:2016 年 4 月 15 日 12:00pm-16:00pm
- 事件 2:2016 年 4 月 15 日 17:00pm-20:00pm
现在使用的方法 returns 我只有一个对象 - 即事件 2。显然我希望同时返回 - 事件 1 和 2。
真不明白为什么会这样!我的代码中遗漏了什么?提前致谢。
int seconds_in_year = 60*60*24*365;
__block
NSDate* currentStart = [NSDate dateWithTimeInterval:0 sinceDate:startTime];
__block
NSDate* currentFinish = [NSDate dateWithTimeInterval:seconds_in_year sinceDate:currentStart];
// use Dictionary for remove duplicates produced by events covered more one year segment
NSMutableDictionary *eventsDict = [NSMutableDictionary dictionaryWithCapacity:1024];
EKEventStore *store = [[EKEventStore alloc] init];
[store requestAccessToEntityType:EKEntityTypeEvent completion:^(BOOL granted, NSError *error) {
if (!granted) { return; }
// enumerate events by one year segment because iOS do not support predicate longer than 4 year !
while ([currentStart compare:endTime] == NSOrderedAscending) {
if ([currentFinish compare:endTime] == NSOrderedDescending) {
currentFinish = [NSDate dateWithTimeInterval:0 sinceDate:endTime];
}
NSPredicate *predicate = [store predicateForEventsWithStartDate:currentStart endDate:currentFinish calendars:nil];
[store enumerateEventsMatchingPredicate:predicate
usingBlock:^(EKEvent *event, BOOL *stop) {
if (event) {
[eventsDict setObject:event forKey:event.eventIdentifier];
}
}];
currentStart = [NSDate dateWithTimeInterval:(seconds_in_year + 1) sinceDate:currentStart];
}
return;
}];
编辑:
如果我尝试另一个事件 3(2016 年 4 月 15 日 14:00pm-19:00pm),那么方法 returns 我整个搜索期间都是日历中的 "event" .相对于之前的情况还是挺头疼的。
如方法名称所示 predicateForEventsWithStartDate 搜索等于或晚于传递日期的 startDate
s参数。