二、Calendar Events 读写

来源:互联网 发布:手游模拟器mac版 编辑:程序博客网 时间:2024/05/29 11:21

简介

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 calendarNSCalendar *calendar = [NSCalendar currentCalendar];// Create the start date componentsNSDateComponents *oneDayAgoComponents = [[NSDateComponents alloc] init];oneDayAgoComponents.day = -1;NSDate *oneDayAgo = [calendar dateByAddingComponents:oneDayAgoComponents                                              toDate:[NSDate date]                                             options:0];// Create the end date componentsNSDateComponents *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];//sortNSMutableArray* 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
原创粉丝点击