EventKit последнее событие календаря
Я делаю приложение, в котором я синхронизирую определенные события с календарем на iPhone.
Проблема в том, что я не могу сказать, какие события были изменены / удалены /... Поэтому мне нужно удалить все события между сегодняшним днем и датой окончания последнего события календаря, прежде чем "синхронизировать" (читай, вставить) новые события.
Насколько я видел, единственный способ выполнить действие над несколькими событиями одновременно, это использовать enumerateEventsMatchingPredicate: usingBlock : и preateateForEventsWithStartDate: endDate: calendars:
Но для этого мне нужна конкретная дата окончания. (и, таким образом, дата окончания последнего события в моем календаре)
Я всегда мог сохранить идентификатор события последнего события, которое я вставил в этот календарь, но я бы предпочел не делать этого: если пользователь удалит мое приложение и установит его позже, у меня больше не будет идентификатора последнего события. (учитывая, что он, конечно, не удалил календарь вручную)
Я мог бы просто удалить календарь каждый раз, когда мне нужно синхронизировать календарь, но тогда я потерял бы все пропущенные события.
Любые идеи или советы очень ценятся!
1 ответ
Для вашего комментария:
Я не могу найти какой-либо способ получить все события календаря.
На самом деле вы можете получить все события из календаря:
NSDate *start = ...
NSDate *finish = ...
// use Dictionary for remove duplicates produced by events covered more one year segment
NSMutableDictionary *eventsDict = [NSMutableDictionary dictionaryWithCapacity:1024];
NSDate* currentStart = [NSDate dateWithTimeInterval:0 sinceDate:start];
int seconds_in_year = 60*60*24*365;
// enumerate events by one year segment because iOS do not support predicate longer than 4 year !
while ([currentStart compare:finish] == NSOrderedAscending) {
NSDate* currentFinish = [NSDate dateWithTimeInterval:seconds_in_year sinceDate:currentStart];
if ([currentFinish compare:finish] == NSOrderedDescending) {
currentFinish = [NSDate dateWithTimeInterval:0 sinceDate:finish];
}
NSPredicate *predicate = [eventStore predicateForEventsWithStartDate:currentStart endDate:currentFinish calendars:nil];
[eventStore enumerateEventsMatchingPredicate:predicate
usingBlock:^(EKEvent *event, BOOL *stop) {
if (event) {
[eventsDict setObject:event forKey:event.eventIdentifier];
}
}];
currentStart = [NSDate dateWithTimeInterval:(seconds_in_year + 1) sinceDate:currentStart];
}
NSArray *events = [eventsDict allValues];