天天看点

二、Calendar Events 读写

简介

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 = -;
NSDate *oneDayAgo = [calendar dateByAddingComponents:oneDayAgoComponents
                                              toDate:[NSDate date]
                                             options:];

// Create the end date components
NSDateComponents *oneYearFromNowComponents = [[NSDateComponents alloc] init];
oneYearFromNowComponents.year = ;
NSDate *oneYearFromNow = [calendar dateByAddingComponents:oneYearFromNowComponents 
                toDate:[NSDate date]  options:];

// 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(, ), ^{ 
        //....do something
    });
        //当stop=YES时,将跳出block
    }];
           

继续阅读