二、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 = -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
    }];
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值