Чтение и запись календарных событий
Можно выбрать, создать, отредактировать и удалить события из базы данных 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 путем установки соответствующих свойств события. Некоторые подробные данные, которые можно отредактировать, включают:
Заголовок события с
title
свойствоЗапуск события и даты окончания с
startDate
иendDate
свойстваКалендарь, с которым событие связано с
calendar
свойствоПредупреждения связались с событием с
alarms
свойство (дополнительную информацию см. в Предупреждениях Конфигурирования),Правило повторения события, если это - повторяющееся событие, с
recurrenceRules
свойство (дополнительную информацию см. в Повторяющихся событиях Создания),
Сохранение и удаление событий
Изменения, которые Вы вносите в событие, не являются постоянными, пока Вы не сохраняете их. Сохраните свои изменения в базе данных 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
объект.