Pergunta

I've added event to iphone calendar using this code

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

    }];
}

but adding event is very slow.I've to wait about 10-12 seconds for completion of this method.Is this normal or i'm doing some thing wrong?I've searched for the same but still no luck. Any suggestion would be appreciated.

Foi útil?

Solução

After some 2 days research i found the solution-i put the event saving code in dispatch_async here is my updated method for adding event-

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


    }];
}

Outras dicas

Try replacing:

  [store saveEvent:event span:EKSpanThisEvent commit:YES error:&err];

by

  [eventStore saveEvent:event span:EKSpanThisEvent error:&err];

Please try this....

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..");

    }
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top