0

次のコードは機能し、iPhone カレンダー データベースからすべてのカレンダー イベントを削除します。しかし、イベントの削除は非常に遅く、iPhone 3GS では 1 秒あたり 2 つのイベントです。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];
}
4

3 に答える 3

1

iOS 5.0 には新しい removeEvent: メソッドがあり、最後まで変更をコミットしないようにすることができます。まだテストしていませんが、まさにここで必要なもののようです。

于 2011-09-22T08:35:24.383 に答える
0

EKEventStoreの使い方ではないからかもしれません!
すべてのユーザーイベントを削除することは非常に危険です...

于 2010-10-28T07:34:38.777 に答える
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];
    }
}
于 2011-05-10T16:39:45.370 に答える