Чтение и запись календарных событий

Можно выбрать, создать, отредактировать и удалить события из базы данных Calendar пользователя с помощью EKEventStore класс. Можно выбрать пользовательский набор событий, соответствующих предикат, который Вы обеспечиваете, или можно выбрать одиночные соревнования его уникальным идентификатором. После выборки события можно получить доступ к его связанной информации календаря со свойствами EKEvent класс. Аналогично, можно изменить его информацию календаря путем установки свойств EKEvent класс.

Соединение с хранилищем события

На iOS 5 и позже, инициализируйте EKEventStore объект с инициализатором по умолчанию:

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

На iOS 6 и позже, необходимо запросить доступ для использования базы данных Calendar пользователя с requestAccessToEntityType:completion: метод после хранилища события инициализируется. Запрашивать доступ к типу объекта асинхронно предлагает пользователю позволять или отклонять Ваше приложение от использования их информации календаря. Необходимо обработать случаи для того, когда пользователь предоставляет и запрещает доступа к приложению:

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

На OS X инициализируйте EKEventStore объект с определяемым инициализатором initWithAccessToEntityTypes::

EKEventStore *store = [[EKEventStore alloc] initWithAccessToEntityTypes:EKEntityMaskEvent];

Вы не должны запрашивать доступ для использования базы данных Calendar пользователя по OS X, потому что автоматически предоставляется доступ.

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

Экземпляр хранилища события не должен быть выпущен перед другими объектами Набора События; иначе, неопределенное поведение может произойти.

Получение событий

Существует два способа получить события. Выборка через предикаты или поисковый запрос, возвратит нуль или больше событий, соответствующих данный запрос. Выборка через уникальные идентификаторы возвратит единственное событие, соответствующее данному идентификатору.

Используя предикаты

Распространено выбрать события, находящиеся в пределах диапазона дат. EKEventStore метод eventsMatchingPredicate: выборки все события, находящиеся в пределах диапазона дат, указанного в предикате, который Вы обеспечиваете. Перечисление 1-1 демонстрирует, как выбрать все события, происходящие между одним днем прежде и спустя один год после текущей даты.

  События Listing 1-1 Fetching с предикатом

// Get the appropriate calendar
NSCalendar *calendar = [NSCalendar currentCalendar];
 
// Create the start date components
NSDateComponents *oneDayAgoComponents = [[NSDateComponents alloc] init];
oneDayAgoComponents.day = -1;
NSDate *oneDayAgo = [calendar dateByAddingComponents:oneDayAgoComponents
                                              toDate:[NSDate date]
                                             options:0];
 
// Create the end date components
NSDateComponents *oneYearFromNowComponents = [[NSDateComponents alloc] init];
oneYearFromNowComponents.year = 1;
NSDate *oneYearFromNow = [calendar dateByAddingComponents:oneYearFromNowComponents
                                                   toDate:[NSDate date]
                                                  options:0];
 
// Create the predicate from the event store's instance method
NSPredicate *predicate = [store predicateForEventsWithStartDate:oneDayAgo
                                                        endDate:oneYearFromNow
                                                      calendars:nil];
 
// Fetch all events that match the predicate
NSArray *events = [store eventsMatchingPredicate:predicate];

Можно указать подмножество календарей для поиска путем передачи массива EKCalendar объекты как календарный параметр predicateForEventsWithStartDate:endDate:calendars: метод. Можно получить календари пользователя от хранилища события calendarsForEntityType: метод. Передача nil говорит методу выбирать от всех календарей пользователя.

Поскольку eventsMatchingPredicate: метод синхронен, Вы не можете хотеть выполнять его на основном потоке своего приложения. Для асинхронного поведения, выполненного метод на другом потоке с dispatch_async функционируйте или с NSOperation объект.

Используя уникальные идентификаторы

Если Вы знаете уникальный идентификатор события, потому что Вы выбрали его ранее с предикатом, можно использовать EKEventStore метод eventWithIdentifier: выбирать событие. Если это будет повторяющееся событие, то этот метод возвратит первое возникновение события. Можно получить уникальный идентификатор события с eventIdentifier свойство.

Создание и редактирование событий

Создайте новое событие с eventWithEventStore: метод EKEvent класс.

Можно отредактировать подробные данные нового события или события, которое Вы ранее выбрали от базы данных Calendar путем установки соответствующих свойств события. Некоторые подробные данные, которые можно отредактировать, включают:

Сохранение и удаление событий

Изменения, которые Вы вносите в событие, не являются постоянными, пока Вы не сохраняете их. Сохраните свои изменения в базе данных Calendar с EKEventStore метод saveEvent:span:commit:error:. Если Вы хотите удалить событие из базы данных Calendar, используйте EKEventStore метод removeEvent:span:commit:error:. Сохраняете ли Вы или удаляете событие, реализование соответствующего метода автоматически синхронизирует Ваши изменения с календарем, событие принадлежит (CalDAV, Exchange, и т.д.).

При сохранении повторяющегося события изменения могут примениться ко всем будущим случаям события путем указания EKSpanFutureEvents для параметра промежутка saveEvent:span:commit:error: метод. Аналогично, можно удалить все будущие случаи события путем указания EKSpanFutureEvents для параметра промежутка removeEvent:span:commit:error: метод.

Выполнение пакетных обработок на событиях

Можно выполнить работу на всех событиях, соответствующих предоставленный предикат EKEventStore метод enumerateEventsMatchingPredicate:usingBlock:. Необходимо создать предикат для этого метода с EKEventStore метод predicateForEventsWithStartDate:endDate:calendars:. Работа, которую Вы обеспечиваете, является блоком типа EKEventSearchCallback.

typedef void (^EKEventSearchCallback)(EKEvent *event, BOOL *stop);

Блок передается два параметра:

событие

Событие, на котором в настоящее время управляют.

остановиться

Булево значение, определяющее, ли enumerateEventsMatchingPredicate:usingBlock: когда этот блок возвращается, должен прекратить обрабатывать события. Если YES, любое событие, соответствующее предикат, но еще не обработанное, останется необработанным.

Поскольку enumerateEventsMatchingPredicate:usingBlock: метод синхронен, Вы не можете хотеть выполнять его на основном потоке своего приложения. Для асинхронного поведения, выполненного метод на другом потоке с dispatch_async функционируйте или с NSOperation объект.