EventKit последнее событие календаря

Я делаю приложение, в котором я синхронизирую определенные события с календарем на iPhone.

Проблема в том, что я не могу сказать, какие события были изменены/удалены/... Поэтому мне нужно удалить все события между сегодняшним днем ​​и датой окончания последнего события календаря до ' синхронизация (читай вставка) новых событий.

Насколько я знаю, единственный способ выполнить действие над несколькими событиями одновременно — это использовать enumerateEventsMatchingPredicate:usingBlock: и predicateForEventsWithStartDate:endDate:calendars:

Но для этого мне нужна конкретная дата окончания. (и, таким образом, дата окончания последнего события в моем календаре)

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

Я мог бы просто удалять календарь каждый раз, когда мне нужно синхронизировать календарь, но тогда я терял бы все пройденные события.

Любые идеи или советы очень ценятся!


person SnyersK    schedule 20.07.2015    source источник


Ответы (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];
person Teja Nandamuri    schedule 20.07.2015
comment
но это для фиксированной даты окончания, нет? - person SnyersK; 20.07.2015
comment
вы можете изменить дату и позвонить, когда вам нужно - person Teja Nandamuri; 20.07.2015
comment
Да, но тогда мне все еще нужно указать дату окончания, а это именно то, чего я не знаю. Мне действительно не нужно последнее событие, мне нужна дата окончания этого события. Если бы я использовал это, мне, вероятно, было бы лучше просто поставить какую-то случайную дату в будущем в качестве конечной даты для моего предиката. - person SnyersK; 20.07.2015
comment
жаль, что я не мог получить вас. Вы хотите вызвать этот метод, отправив разные даты окончания? - person Teja Nandamuri; 20.07.2015
comment
что вы подразумеваете под датой окончания этого события? Вы хотите получить последнюю дату, если событие существует более одного дня? - person Teja Nandamuri; 20.07.2015
comment
Мне просто нужно иметь возможность определить дату окончания последнего события данного календаря. Если нет другого варианта, кроме того, что вы указали здесь, то я думаю, что мой лучший вариант — просто использовать now + 1 year в качестве даты окончания. - person SnyersK; 20.07.2015