Как быстрее удалить события календаря? - PullRequest
0 голосов
/ 28 октября 2010

Следующий код работает и удаляет все события календаря из базы данных календаря iPhone. Но события удаляются очень медленно: 2 события в секунду на iPhone 3GS. Так что, если у вас есть 3000 событий - тогда это 25 минут, чтобы стереть их ... Как бы вы оптимизировали этот код? Может я что то не так делаю? Спасибо.

- (void)deleteAllCalendarEventsFromIPhone:(NSError **)error {
    EKEventStore *store = [[EKEventStore alloc] init];

    NSUInteger beginYear = 1900;
    NSUInteger endYear = 2100;

    while (beginYear < endYear) {
        NSPredicate *predicate = 
            [store predicateForEventsWithStartDate:[self createDateWithYear:beginYear month:1 day:1] 
                                           endDate:[self createDateWithYear:beginYear + 4 month:1 day:1] 
                                         calendars:nil];
        NSArray *eventList = [store eventsMatchingPredicate:predicate];
        for (EKEvent *event in eventList) {         
            success = [store removeEvent:event span:EKSpanThisEvent error:nil];
        }
        beginYear += 4;
    }
    [store release];
}

Ответы [ 3 ]

1 голос
/ 22 сентября 2011

В iOS 5.0 появился новый метод removeEvent:, который позволяет вам не фиксировать изменения до самого конца. Я еще не проверял это, но это звучит как раз то, что вам нужно здесь.

0 голосов
/ 10 мая 2011
-(void)deleteElementFromCalendarDB {
    CFGregorianDate gregorianStartDate, gregorianEndDate;
    CFGregorianUnits startUnits = {-2, 0, 0, 0, 0, 0}; 
    CFGregorianUnits endUnits = {1, 0, 0, 0, 0, 0};
    CFTimeZoneRef timeZone = CFTimeZoneCopySystem();
    gregorianStartDate =  CFAbsoluteTimeGetGregorianDate(
        CFAbsoluteTimeAddGregorianUnits(CFAbsoluteTimeGetCurrent(),
        timeZone,startUnits),timeZone);
    gregorianStartDate.hour = 0;
    gregorianStartDate.minute = 0;
    gregorianStartDate.second = 0;
    gregorianEndDate = CFAbsoluteTimeGetGregorianDate(
        CFAbsoluteTimeAddGregorianUnits(CFAbsoluteTimeGetCurrent(),
        timeZone, endUnits),timeZone);
    gregorianEndDate.hour = 0; 
    gregorianEndDate.minute = 0; 
    gregorianEndDate.second = 0;
    NSDate* startDate = [NSDate dateWithTimeIntervalSinceReferenceDate:
    CFGregorianDateGetAbsoluteTime(gregorianStartDate, timeZone)];
    NSDate* endDate =   [NSDate dateWithTimeIntervalSinceReferenceDate:
    CFGregorianDateGetAbsoluteTime(gregorianEndDate, timeZone)];
    CFRelease(timeZone);
    NSError *err;
    NSPredicate *predicate = [self.eventStore predicateForEventsWithStartDate:startDate
        endDate:endDate
        calendars:nil];
    NSArray *eventListS = [self.eventStore eventsMatchingPredicate:predicate];
    for (EKEvent *event in eventListS) {           
        [self.eventStore removeEvent:event span:EKSpanFutureEvents error:&err];
    }
    if (err == noErr) {
        UIAlertView *alert =[[UIAlertView alloc]itWithTitle:@"All Events were deleted"                                              message:@"How about that?" 
            delegate:nil
            cancelButtonTitle:@"Okay" 
            otherButtonTitles:nil];
        [alert show];
        [alert release];
    }
}
0 голосов
/ 28 октября 2010

Возможно, потому что это не использование EKEventStore!
Удаление всех пользовательских событий довольно опасно ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...