2010-10-28 7 views
0

Le code suivant fonctionne et supprime tous les événements de calendrier de la base de données de calendrier iPhone. Mais les événements suppriment très lentement: 2 événements par seconde sur l'iPhone 3GS. Donc, si vous avez 3000 événements - alors il faut 25 minutes pour les effacer ... Comment optimiseriez-vous ce code? Peut-être que je fais quelque chose de mal? Merci.Comment supprimer les événements du calendrier plus rapidement?

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

Répondre

0

Peut-être parce que ce n'est pas l'utilisation de EKEventStore!
Suppression de tout événement utilisateur est très dangereux ...

+0

Je ne suis pas d'accord avec vous. C'est l'utilisation de EKEventStore. Je reçois des calendriers GroupWise (5000 événements) et je les sauvegarde dans l'application calendrier iPhone (en utilisant le préfixe GW au début du nom de l'événement). Et puis, si l'utilisateur n'a pas besoin de ces événements dans iCal - il peut le supprimer, en utilisant ma fonction. –

0
-(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

Je pense que ce sera mieux si vous utilisez ces lignes de code suivants. –

+0

Pourriez-vous s'il vous plaît formater ceci. Il est très difficile de lire –

+0

Je pense que c'est plus clair en ce moment :) –

1

iOS 5.0 a une nouvelle removeEvent: méthode qui vous permet de ne pas engager des changements jusqu'à la fin. Je ne l'ai pas encore testé, mais cela semble être exactement ce dont vous avez besoin ici.

Questions connexes