EventKit 日历的最后一个事件

Posted

技术标签:

【中文标题】EventKit 日历的最后一个事件【英文标题】:EventKit last event of calendar 【发布时间】:2015-07-20 12:15:12 【问题描述】:

我正在制作一个应用程序,用于将某些事件同步到 iPhone 上的日历。

问题是,我无法知道哪些事件被更改/删除/... 所以我需要在“同步”(读取插入)新事件之前删除今天和日历最后一个事件的结束日期之间的所有事件

据我所知,一次对多个事件执行操作的唯一方法是使用 enumerateEventsMatchingPredicate:usingBlock: 和 predicateForEventsWithStartDate:endDate:calendars:

但为此我需要一个具体的结束日期。 (因此,我的日历中最后一个事件的结束日期)

我总是可以保存我插入此日历的最后一个事件的事件标识符,但我宁愿不这样做: 如果用户卸载我的应用程序并稍后再次安装,我将不再拥有最后一个事件标识符。 (考虑到他当然没有手动删除日历)

我可以在每次需要同步日历时删除日历,但这样我会丢失所有通过的事件。

非常感谢任何想法或提示!

【问题讨论】:

【参考方案1】:

对于您的评论:

我似乎找不到任何方法来获取日历的所有事件。

实际上您可以从日历中获取所有事件:

NSDate *start = ...
NSDate *finish = ...

// use Dictionary for remove duplicates produced by events covered more one year segment
NSMutableDictionary *eventsDict = [NSMutableDictionary dictionaryWithCapacity:1024];

NSDate* currentStart = [NSDate dateWithTimeInterval:0 sinceDate:start];

int seconds_in_year = 60*60*24*365;

// enumerate events by one year segment because ios do not support predicate longer than 4 year !
while ([currentStart compare:finish] == NSOrderedAscending) 

    NSDate* currentFinish = [NSDate dateWithTimeInterval:seconds_in_year sinceDate:currentStart];

    if ([currentFinish compare:finish] == NSOrderedDescending) 
        currentFinish = [NSDate dateWithTimeInterval:0 sinceDate:finish];
    
    NSPredicate *predicate = [eventStore predicateForEventsWithStartDate:currentStart endDate:currentFinish calendars:nil];
    [eventStore enumerateEventsMatchingPredicate:predicate
                                      usingBlock:^(EKEvent *event, BOOL *stop) 

                                          if (event) 
                                              [eventsDict setObject:event forKey:event.eventIdentifier];
                                          

                                      ];       
    currentStart = [NSDate dateWithTimeInterval:(seconds_in_year + 1) sinceDate:currentStart];



NSArray *events = [eventsDict allValues];

【讨论】:

但那是固定的结束日期,不是吗? 您可以更改日期并在需要时调用它 是的,但是我仍然需要提供一个结束日期,这正是我不知道的一件事。我真的不需要最后一个事件,我需要那个事件的结束日期。如果我要使用它,我可能会更好地将未来的某个随机日期作为我的谓词的结束日期。 很抱歉没能找到你。你的意思是,你想通过发送不同的结束日期来调用这个方法? 您所说的活动结束日期是什么意思?如果事件存在超过一天,您想获取最后日期吗?

以上是关于EventKit 日历的最后一个事件的主要内容,如果未能解决你的问题,请参考以下文章

Swift 4.0 Eventkit 无法正确获取日历和事件

iOS - 无法使用 EventKit 将日历事件添加到 Gmail 日历

如何区分通过我的应用程序保存的事件和使用 EventKit 使用日历应用程序保存的事件?

将 EventKit 事件与远程数据库同步

使用 EventKit 对 iOS 日历进行文本搜索

用户数据攻略-获取日历事件