Вот метод построения предиката для извлечения неповторяющихся событий, происходящих в данный день (повторяющиеся события требуют дополнительной обработки):
- (NSPredicate *) predicateToRetrieveEventsForDate:(NSDate *)aDate {
// start by retrieving day, weekday, month and year components for the given day
NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
NSDateComponents *todayComponents = [gregorian components:(NSDayCalendarUnit | NSMonthCalendarUnit | NSYearCalendarUnit) fromDate:aDate];
NSInteger theDay = [todayComponents day];
NSInteger theMonth = [todayComponents month];
NSInteger theYear = [todayComponents year];
// now build a NSDate object for the input date using these components
NSDateComponents *components = [[NSDateComponents alloc] init];
[components setDay:theDay];
[components setMonth:theMonth];
[components setYear:theYear];
NSDate *thisDate = [gregorian dateFromComponents:components];
[components release];
// build a NSDate object for aDate next day
NSDateComponents *offsetComponents = [[NSDateComponents alloc] init];
[offsetComponents setDay:1];
NSDate *nextDate = [gregorian dateByAddingComponents:offsetComponents toDate:thisDate options:0];
[offsetComponents release];
[gregorian release];
// build the predicate
NSPredicate *predicate = [NSPredicate predicateWithFormat: @"startDate < %@ && endDate > %@", nextDate, thisDate];
return predicate;
}
Предикат почти равен тому, который предложен @Tony, за исключением того, что это не проверяет на равенство.Вот почему.Предположим, у вас есть мероприятие, начинающееся 8 декабря 23:00 и заканчивающееся 9 декабря 00:00.Если вы проверяете события с датой окончания> =, а не> данного дня, ваше приложение сообщит о событии как 8, так и 9 декабря, что явно неверно.Попробуйте добавить такое событие как в iCal, так и в Календарь Google, и вы увидите, что это событие появляется только 8 декабря. На практике не следует предполагать, что данный день заканчивается в 23:59:59 (даже если это, конечно,true): вам нужно относиться к полуночи как к последней секунде данного дня (относительно конца события).Также обратите внимание, что это не предотвращает события, начинающиеся в полночь.