Некоторые EKEvents не соответствуют предикату

Я работаю над приложением календаря.

В течение месяца я весь день зацикливаюсь, чтобы получить события этого дня. Я должен сделать это, чтобы обрабатывать повторяющиеся события и события дольше одного дня.

Он отлично работает, за исключением одного случая: последний день многодневного мероприятия. Я вижу событие для других дней этого события, но не для последнего. (Я нахожусь в часовом поясе GMT+1, поэтому у меня есть эти часы)

SEARCH FOR THE LAST DAY OF EVENT
Start:  2013-03-25 23:00:00 +0000
End:    2013-03-26 22:59:59 +0000

EVENT
Start:  2013-03-24 21:00:06 +0000
End:    2013-03-26 21:00:06 +0000

No results!

Вот метод, возвращающий события дня:

+ (NSArray *)ekEventsWithStartDate:(NSDate*)startDate endDate:(NSDate*)endDate
{
    NSLog(@"ekEventsWithStartDate:%@ endDate:%@",startDate,endDate);
    NSPredicate *predicate = [_eventStore predicateForEventsWithStartDate:startDate
                                                                  endDate:endDate
                                                                calendars:nil];

    NSArray *events = [_eventStore eventsMatchingPredicate:predicate];
    NSLog(@"events (%d):%@",[events count],events);
    return events;
}

Вот подробности события:

EKEvent <0xb0635e0> {EKEvent <0xb0635e0> 
{title =  24-26 Mars 10 PM; 
 location = ; 
 calendar = EKCalendar <0xb3c3c80> {title = Calendar; type = Local; allowsModify = YES; color = #0E61B9;}; 
 alarms = (null);  
 URL = (null); 
 lastModified = 2013-03-19 22:11:10 +0000; 
 timeZone = Europe/Paris (GMT+01:00) offset 3600}; 
 location = ; 
 startDate = 2013-03-24 21:00:06 +0000; 
 endDate = 2013-03-26 21:00:06 +0000; 
 allDay = 0; 
 floating = 0; 
 recurrence = (null); 
 attendees = (null)}

Вот журнал за 3 дня этого события из метода ekEventsWithStartDate:

ekEventsWithStartDate:2013-03-23 23:00:00 +0000 endDate:2013-03-24 22:59:59 +0000
events (1):(
    "EKEvent <0x9b44c00> {EKEvent <0x9b44c00> {title =  24-26 Mars 10 PM; location = ; calendar = EKCalendar <0xb336870> {title = Calendar; type = Local; allowsModify = YES; color = #0E61B9;}; alarms = (null); URL = (null); lastModified = 2013-03-19 22:11:10 +0000; timeZone = Europe/Paris (GMT+01:00) offset 3600}; location = ; startDate = 2013-03-24 21:00:06 +0000; endDate = 2013-03-26 21:00:06 +0000; allDay = 0; floating = 0; recurrence = (null); attendees = (null)}"
)

ekEventsWithStartDate:2013-03-24 23:00:00 +0000 endDate:2013-03-25 22:59:59 +0000
events (1):(
    "EKEvent <0xb28b970> {EKEvent <0xb28b970> {title =  24-26 Mars 10 PM; location = ; calendar = EKCalendar <0xb336870> {title = Calendar; type = Local; allowsModify = YES; color = #0E61B9;}; alarms = (null); URL = (null); lastModified = 2013-03-19 22:11:10 +0000; timeZone = Europe/Paris (GMT+01:00) offset 3600}; location = ; startDate = 2013-03-24 21:00:06 +0000; endDate = 2013-03-26 21:00:06 +0000; allDay = 0; floating = 0; recurrence = (null); attendees = (null)}"
)

ekEventsWithStartDate:2013-03-25 23:00:00 +0000 endDate:2013-03-26 22:59:59 +0000
events (0):(null)

Почему метод возвращает нулевой массив?

Дополнительный вопрос: есть ли лучший способ получать события для каждого дня месяца? Я ищу лучшие выступления.

Спасибо за помощь!

Редактировать 20/03/2013: благодаря Dhruvik я выяснил, что мой код отлично работает для iOS 5.X, но не работает для iOS 6.X (нет теста для 4.X).

Я проверяю события и даты для версий 5.X и 6.X, и единственная разница, которую я увидел, заключается в свойстве часового пояса календаря событий:

iOS 5.X
timeZone = Europe/Paris (CET)

iOS 6.X
timeZone = Europe/Paris (UTC+01:00)

Эта проблема не касается событий полного дня.

Есть ли у вас такая же проблема с iOS 6.X?


person Alex    schedule 19.03.2013    source источник


Ответы (1)


Вот код для создания события, которое я реализовал в своем приложении.

in .h

@property (nonatomic, retain) EKEventStore *eventStore;
@property (nonatomic, retain) EKCalendar *defaultCalendar;
@property (nonatomic, retain) NSMutableArray *eventsList;

in .m

//This code will fecth the events from one day Before the current date..

- (void) fetchevents
{

   eventStore = [[EKEventStore alloc] init];

   eventsList = [[NSMutableArray alloc] init];

   EKEventStore *store = [[EKEventStore alloc] init];

   [store requestAccessToEntityType:EKEntityTypeEvent completion:^(BOOL granted, NSError *error) {
       // handle access here
   }];

   // Get the appropriate calendar
   NSCalendar *calendar = [NSCalendar currentCalendar];

   // Create the start date components
   NSDateComponents *oneDayAgoComponents = [[NSDateComponents alloc] init];
   oneDayAgoComponents.day = -1; // From which date you have to fetch Events from calander, as per your need subtract the days from current date

   NSDate *oneDayAgo = [calendar dateByAddingComponents:oneDayAgoComponents
                                              toDate:[NSDate date]
                                             options:0];

   NSLog(@"%@", oneDayAgo);

   // Create the end date components
   NSDateComponents *oneYearFromNowComponents = [[NSDateComponents alloc] init];
   oneYearFromNowComponents.year = 0;
   NSDate *oneYearFromNow = [calendar dateByAddingComponents:oneYearFromNowComponents
                                                   toDate:[NSDate date]
                                                  options:0];
   NSLog(@"%@", oneYearFromNow);

   //Create the predicate from the event store's instance method
   NSPredicate *predicate = [store predicateForEventsWithStartDate:oneDayAgo endDate:oneYearFromNow                                                                                      calendars:nil];


   NSArray *events_Array = [eventStore eventsMatchingPredicate: predicate];

   for (EKEvent *eventToCheck in events_Array)
   {
       [eventsList addObject:eventToCheck.title ];
   }
}

Надеюсь, это поможет. Удачного кодирования.. Спасибо

person Dhruvik    schedule 20.03.2013
comment
Спасибо за ваш код. Я создаю новый пустой проект для тестирования (он очень близок к моему коду), и у меня та же проблема. Но благодаря вашему ответу я тестирую несколько iOS и обнаружил, что моя проблема не появляется для iOS 5.X, она только для 6.X (я не тестирую 4.X). Мне интересно, является ли это регрессом Apple. - person Alex; 20.03.2013
comment
хорошо .. и да, это может быть регресс от Apple. так у вас есть полное решение из моего кода? - person Dhruvik; 20.03.2013
comment
Нет, у меня такой же код, как и у вас, и он не работает для iOS 6.X. - person Alex; 20.03.2013
comment
Хорошо, вам нужно протестировать событие на 3 дня (не в режиме полного дня) и попытаться получить событие с датой начала в начале дня # 3 (00:00) и датой окончания в конце # 3 день (23:59) - person Alex; 20.03.2013
comment
@Dhruvik, не могли бы вы помочь мне, можем ли мы получить триггер, когда какое-либо конкретное событие загорится? - person Esha; 02.12.2014