iOS将事件添加到日历非常慢?

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

我已使用以下代码将事件添加到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秒才能完成此方法。这是正常的还是我做错了什么?我已经搜索了相同的,但仍然没有运气。 如有任何建议,将不胜感激

尝试更换:

  [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();
        });


    }];
}