【发布时间】:2014-03-13 06:08:59
【问题描述】:
我从网络服务收到一些事件。我使用 Eventkit 以编程方式添加这些事件。我有一个Add 按钮,它调用代码来添加接收到的事件。但是,重复添加操作会复制事件而不是合并(如果事件已经存在)。
如何避免重复事件?
【问题讨论】:
标签: ios iphone objective-c eventkit
我从网络服务收到一些事件。我使用 Eventkit 以编程方式添加这些事件。我有一个Add 按钮,它调用代码来添加接收到的事件。但是,重复添加操作会复制事件而不是合并(如果事件已经存在)。
如何避免重复事件?
【问题讨论】:
标签: ios iphone objective-c eventkit
您必须在添加之前检查现有事件。下面的代码显示了如何做到这一点。我已经单独检查了标题和开始日期来识别事件,您可以根据需要使用更多参数。
EKEventStore *eventStore = [[EKEventStore alloc] init];
NSPredicate *predicate = [eventStore predicateForEventsWithStartDate:[startDate dateByAddingTimeInterval:-60]
endDate:[endDate dateByAddingTimeInterval:60] calendars:nil];
NSArray *events = [eventStore eventsMatchingPredicate:predicate];
bool found = NO;
for ( EKEvent *evt in events )
{
if ( [evt.title isEqualToString:title] && [evt.startDate isEqualToDate:startDate])
{
found = YES;
break;
}
}
if(!found)
{
//Add your event here.
}
【讨论】:
即使我在向日历添加事件时也遇到了重复事件问题。所以在添加事件之前,我首先通过在谓词中传递开始和结束日期来删除它们,如下所示。
func removeMobileCalendarEvents(){
//lstEvents is response array which i got from web service and stored in model class
for eventObj in lstEvents.list {
let predicate = eventStore.predicateForEvents(withStart: eventStartDate, end: eventEndDate, calendars: nil)
let events = eventStore.events(matching: predicate)
for event in events {
print("event title",event.title)
print("event start date",event.startDate)
print("event end date",event.endDate)
//lstEvents is response array which i got from web service and stored in model class
for eventObj in lstEvents.list {
if event.title! == eventObj.EventName {
//exists
do {
try eventStore.remove(event, span: .thisEvent, commit: true)
}
catch {
print("Error saving event in calendar") }
}else{
//not exists
}
}
}
}
addingEventsToMobileCalendar()
}
一旦收到来自 Web 服务的响应,请调用 removeMobileCalendarEvents() 方法。调用 removeMobileCalendarEvents() 方法,多次调用 api。
【讨论】: