我已使用此代码将事件添加到iphone日历
-(void)setEvent:(NSString *)title withStartDate:(NSDate *)startDate withEndDate:(NSDate *)endDate completion:(void (^)(void))completionBlock
{
EKEventStore* store = [[EKEventStore alloc] init];
[store requestAccessToEntityType:EKEntityTypeEvent completion:^(BOOL granted, NSError *error) {
if (!granted)
{
return;
}
EKEvent *event = [EKEvent eventWithEventStore:store];
event.title = title;
event.startDate = startDate;
event.endDate = endDate;
[event setCalendar:[store defaultCalendarForNewEvents]];
NSError *err = nil;
[store saveEvent:event span:EKSpanThisEvent commit:YES error:&err];
// NSString *savedEventId = event.eventIdentifier;
NSString* alertTitle;
NSString* msg;
if (err) {
alertTitle = @"Calendar was not set";
msg = @"Please set default calendar in settings.";
}
else
{
alertTitle = @"Event added";
msg = @"Event had been added in your calendar.";
}
UIAlertView* alert = [[UIAlertView alloc] initWithTitle:alertTitle message:msg delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil, nil];
[alert show];
completionBlock();
}];
}
但添加事件非常慢。我要等待大约10-12秒才能完成此方法。这是正常的还是我做错了什么?我已经搜索了同样但仍然没有运气。 任何建议将不胜感激。
答案 0 :(得分:8)
经过2天的研究后,我找到了解决方案 - 我将事件保存代码放在dispatch_async
这里是我更新的添加事件的方法 -
-(void)setEvent:(NSString *)title withStartDate:(NSDate *)startDate withEndDate:(NSDate *)endDate withResecheduling:(BOOL)rescheduling completion:(void (^)(void))completionBlock
{
[[BusyIndicator sharedInstance] startIndicator];
EKEventStore* store = [[EKEventStore alloc] init];
[store requestAccessToEntityType:EKEntityTypeEvent completion:^(BOOL granted, NSError *error) {
if (!granted)
{
return;
}
dispatch_async(dispatch_get_main_queue(), ^{
EKEvent *event = [EKEvent eventWithEventStore:store];
event.title = title;
event.startDate = startDate;
event.endDate = endDate;
[event setCalendar:[store defaultCalendarForNewEvents]];
NSError *err = nil;
[store saveEvent:event span:EKSpanThisEvent commit:YES error:&err];
// NSString *savedEventId = event.eventIdentifier;
if (!rescheduling) {
NSString* alertTitle;
NSString* msg;
if (err) {
alertTitle = @"Calendar was not set";
msg = @"Please set default calendar in settings.";
}
else
{
alertTitle = @"Event added";
msg = @"Event has been added in your calendar.";
}
UIAlertView* alert = [[UIAlertView alloc] initWithTitle:alertTitle message:msg delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil, nil];
[alert show];
}
[[BusyIndicator sharedInstance] stopIndicator];
completionBlock();
});
}];
}
答案 1 :(得分:1)
尝试更换:
[store saveEvent:event span:EKSpanThisEvent commit:YES error:&err];
通过
[eventStore saveEvent:event span:EKSpanThisEvent error:&err];
答案 2 :(得分:1)
请试试这个......
EKEventStore *eventStore = [[EKEventStore alloc] init];
if([eventStore respondsToSelector:@selector(requestAccessToEntityType:completion:)])
{
// iOS 6 and later
// This line asks user's permission to access his calendar
[eventStore requestAccessToEntityType:EKEntityTypeEvent completion:^(BOOL granted, NSError *error)
{
if (granted) // user user is ok with it
{
EKEvent *event = [EKEvent eventWithEventStore:eventStore];
event.title = eventname;
event.allDay = NO;
event.startDate = StartDateobject; // StartDateObject is Object of Date Class
event.endDate=event.startDate;
[event setCalendar:[eventStore defaultCalendarForNewEvents]];
NSError *err;
[eventStore saveEvent:event span:EKSpanThisEvent error:&err];
if(err)
{
NSLog(@"Unable to save event to the calendar!: Error= %@", err);
}
else
{
NSLog(@"Event added successfully.");
}
}
}];
}
// iOS < 6
else
{
EKEvent *event = [EKEvent eventWithEventStore:eventStore];
event.title = eventname;
event.allDay = NO;
event.startDate = StartDateobject; // StartDateObject is Object of Date Class
event.endDate=event.startDate;
[event setCalendar:[eventStore defaultCalendarForNewEvents]];
NSError *err;
[eventStore saveEvent:event span:EKSpanThisEvent error:&err];
if(err)
{
NSLog(@"unable to save event to the calendar!: Error= %@", err);
}
else
{
NSLog(@"Event added successfully..");
}
}