Проверка наличия дублированных элементов перед добавлением нового события в iOS - EKEventStore - PullRequest
6 голосов
/ 17 февраля 2012

Я новичок в программировании на iOS и работаю над простым проектом, в котором перечислены праздники из данного города и пользователи могут добавлять эти события в календарь iCal по умолчанию.

Вопрос: как проверить, есть ли уже событие с такими же свойствами (например, заголовок и дата начала) в календаре пользователя. Это может произойти, если кнопка действия (используемая для добавления события в iCal) нажата более одного раза. В такой ситуации я не хочу, чтобы в iCal создавались два или более одинаковых события.

Я пытался использовать NSPredicate, но я совершенно заблудился, как его отсортировать.

Буду признателен за любую помощь! Заранее спасибо.

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

for (int i = 0; i<[allHolidayNames count]; ++i) {

    // ------ EVENT MANIPULATION ------

    EKEventStore *eventStore = [[EKEventStore alloc] init];
    EKEvent *addEvent = [EKEvent eventWithEventStore:eventStore];
    addEvent.title = [allHolidayNames objectAtIndex:i];
    addEvent.startDate = [allHolidayDates objectAtIndex:i];
    addEvent.allDay = YES;
    [addEvent setCalendar:[eventStore defaultCalendarForNewEvents]];
    [eventStore saveEvent:addEvent span:EKSpanThisEvent commit:YES error:nil];
}   

1 Ответ

15 голосов
/ 18 февраля 2012

Сводка

В какой-то момент в вашем методе экземпляра (возможно, во время цикла for) вы захотите создать NSPredicate на основе [allHolidayDates objectAtIndex:i] для возврата массива, который вы просматриваете в цикле, чтобы проверить, если [allHolidayNames objectAtIndex:i]присутствует в возвращаемых событиях.

Пример кода

for (int i = 0; i<[allHolidayNames count]; ++i) {

    // ------ EVENT MANIPULATION ------

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

    NSPredicate *predicateForEventsOnHolidayDate = [eventStore predicateForEventsWithStartDate:[allHolidayDates objectAtIndex:i] endDate:[allHolidayDates objectAtIndex:i] calendars:nil]; // nil will search through all calendars

    NSArray *eventsOnHolidayDate = [eventStore eventsMatchingPredicate:predicateForEventsOnHolidayDate]

    BOOL eventExists = NO;

    for (EKEvent *eventToCheck in eventsOnHolidayDate) {
        if ([eventToCheck.title isEqualToString:[allHolidayNames objectAtIndex:i]]) {
            eventExists = YES;
        }
    }

    if (eventExists == NO) {
        EKEvent *addEvent = [EKEvent eventWithEventStore:eventStore];
        addEvent.title = [allHolidayNames objectAtIndex:i];
        addEvent.startDate = [allHolidayDates objectAtIndex:i];
        addEvent.allDay = YES;
        [addEvent setCalendar:[eventStore defaultCalendarForNewEvents]];
        [eventStore saveEvent:addEvent span:EKSpanThisEvent commit:YES error:nil];
    }
}

Советы

  • Для визуализации данных, особенно содержимого массивов и объектовпопробуйте использовать NSLog.Это выведет содержимое объекта на консоль, чтобы помочь вам немного лучше понять структуры данных.

    NSLog ("eventsOnHolidayDate =% @", eventsOnHolidayDate);

  • Обратите внимание, что eventsMatchingPredicate будет блокировать основной поток во время получения событий.Если вы делаете это несколько раз подряд, это может повлиять на пользовательский опыт.Вам следует рассмотреть возможность использования enumerateEventsMatchingPredicate:usingBlock: (выходит за рамки этого вопроса).

...