简介
EKEventStore Class可以对Calendar database进行增删查改操作。你可以根据自定义条件(predicate:中文翻译为谓词,可以理解为真真假假的函数, a predicate you provide,即你提供的条件)获取自定义事件,也可以根据唯一标识获取个人事件。获取到事件后, 你可以通过EKEvent 类获取日历信息, 也可以修改日历信息。
连接Event Store
IOS5:EKEventStore* store = [[EKEventStore alloc] init];
IOS6及以后,在初始化后需要获取权限
store requestAccessToEntityType:EKEntityTypeEvent completion:^(BOOL granted, NSError *error){
...
//异步回调
}
注意:
1.EKEventStore在初始化和释放时需要时间较长, 所以不要对每个事件单独申请对象, 而做成单例即可。
2.store必须最后释放, 如果在其他Event Kit对象释放前释放, 则可能产生错误。
获取Events
目前有两种获取事件的方法。第一种是通过谓词或搜索条件来获取,只要符合条件的事件都会获取到。第二种是通过唯一标识获取,则只会获取到一个。 注意:从Calendar database获取到的事件不一定按时间进行排序,如果要排序,则需要调用排序函数
使用谓词
获取事件时,通常会指定一段时间范围,使用EKEventStore中的方法eventsMatchingPredicate:可以获取指定时间范围内的事件。
下面展示一段获取事件的代码:
// 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必须通过该方法获取
//参数calendars是一个calendar的集合,如果为nil,表示所有用户的calendars
NSPredicate *predicate = [store predicateForEventsWithStartDate:oneDayAgo
endDate:oneYearFromNow calendars:nil];
// Fetch all events that match the predicate、
//该方法为同步方法,最好放在工作线程里做
NSArray *events = [store eventsMatchingPredicate:predicate];
//sort
NSMutableArray* sortedArray = [NSMutableArray arraywithArray:
[events sortedArrayUsingSelector:@selector(compareStartDateWithEvent:)]];
使用唯一标识
EKEventStore eventWithIdentifier: 方法可以根据唯一标识获取事件,如果该事件为循环提醒事件, 则返回第一次发生的事件。
创建和编辑事件
Note:如果开发平台是ios,你可以用Event Kit UI framework提供的event view controllers模板进行事件的操作。
创建事件的接口,EKEvent eventWithEventStore:
事件可编辑项:
- 标题
- 开始和结束事件
- 事件关联的日历属性,如日历类型:工作、日历、家庭;被邀请人
- 事件关联的提醒属性,如提醒的时间点、显示为
- 事件规则,是否重复执行
保存和删除事件
注意:在更改Calendar database时, 一定要让用户进行确认。
事件的修改将在保存之后才生效,保存接口: EKEventStore saveEvent:span:commit:error:
删除接口: EKEventStore removeEvent:span:commit:error:
以上两个接口中的span参数, 如果指定为EKSpanFutureEvents, 则对于循环发生的事件, 将应用到未来出现的所有事件中
以上两个接口中的commit参数, 如果传NO,则必须要保证在后面的代码中调用commit从而使操作永久生效。ps:YES时会立即生效。
当删除或保存操作时,都会自动同步到该事件所属的日历(CalDAV, Exchange 等)
批处理事件操作
该方法根据predicate枚举每个事件, 可以在block中对每个事件进行操作。
[eventStore enumerateEventsMatchingPredicate:predicate usingBlock:^(EKEvent *event, BOOL *stop){
NSLog(@"%@", event);
//该block方法为同步方法, 应该放到工作线程中执行
dispatch_async(dispatch_get_global_queue(0, 0), ^{
//....do something
});
//当stop=YES时,将跳出block
}];