iOS将事件添加到日历非常慢?
我已使用以下代码将事件添加到iphone日历中iOS将事件添加到日历非常慢?,ios,objective-c,ekevent,Ios,Objective C,Ekevent,我已使用以下代码将事件添加到iphone日历中 -(void)setEvent:(NSString *)title withStartDate:(NSDate *)startDate withEndDate:(NSDate *)endDate completion:(void (^)(void))completionBlock { EKEventStore* store = [[EKEventStore alloc] init]; [store requestAccessToE
-(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秒才能完成此方法。这是正常的还是我做错了什么?我已经搜索了相同的,但仍然没有运气。
如有任何建议,将不胜感激 尝试更换:
[store saveEvent:event span:EKSpanThisEvent commit:YES error:&err];
借
请试试这个
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..");
}
}
EKEventStore*eventStore=[[EKEventStore alloc]init];
if([eventStore respondsToSelector:@selector(requestAccessToEntityType:完成:)]))
{
//iOS 6及更高版本
//此行请求用户访问其日历的权限
[eventStore requestAccessToEntityType:eEntityTypeEvent completion:^(已授予布尔,N错误*错误)
{
如果(已授予)//用户同意
{
EKEvent*event=[EKEvent eventWithEventStore:eventStore];
event.title=eventname;
event.allDay=否;
event.startDate=StartDateobject;//StartDateobject是日期类的对象
event.endDate=event.startDate;
[事件设置日历:[eventStore defaultCalendarForNewEvents]];
n错误*错误;
[eventStore saveEvent:event span:EKSpanThisEvent错误:&err];
如果(错误)
{
NSLog(@“无法将事件保存到日历:错误=%@”,错误);
}
其他的
{
NSLog(@“已成功添加事件”);
}
}
}];
}
//iOS<6
其他的
{
EKEvent*event=[EKEvent eventWithEventStore:eventStore];
event.title=eventname;
event.allDay=否;
event.startDate=StartDateobject;//StartDateobject是日期类的对象
event.endDate=event.startDate;
[事件设置日历:[eventStore defaultCalendarForNewEvents]];
n错误*错误;
[eventStore saveEvent:event span:EKSpanThisEvent错误:&err];
如果(错误)
{
NSLog(@“无法将事件保存到日历:错误=%@”,错误);
}
其他的
{
NSLog(@“已成功添加事件…”);
}
}
经过大约2天的研究,我找到了解决方案——我将事件保存代码放入调度\u 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();
});
}];
}
是本地日历还是远程日历?如果它被选为默认日历,可能它正试图与外部日历(例如谷歌日历)同步……如何检查?不过,事件会添加到iOS的本机日历应用程序中。配置->电子邮件、联系人、cal->日历->默认日历。如果配置GMail帐户,默认情况下会选择它的日历。没有添加帐户,默认日历设置为calendar??同样的事情也在模拟器上。对不起,它更慢了!!您正在检查哪个ios版本?以下6在iOS 6.1和iOS 7上有另一种方式,日期格式是2013-10-15 20:00:00+0000,我是从Web服务获得的。dateString的用途是什么,StartDateobject是什么?那么提交保存呢?意味着它将如何提交呢?感谢buddy的考虑,我得到了解决方案,请检查我的答案。我看到了同样的情况-在尝试呈现UI以供用户选择日历时,在块中延迟10-30秒,无论是使用我自己的UI还是EKCalendarChooser。无论如何,异步调度也为我解决了这个问题。
-(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();
});
}];
}