Domanda

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.

È stato utile?

Soluzione

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


    }];
}

Altri suggerimenti

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

    }
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top