2010-10-28 59 views
0

以下代碼工作並從iPhone日曆數據庫中刪除所有日曆事件。 但事件正在刪除速度很慢:iPhone 3GS每秒發生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]; 
} 

回答

0

也許是因爲它不是EKEventStore的用法!
刪除所有用戶事件是相當危險的......

+0

我不同意你的看法。這是EKEventStore的用法。我收到GroupWise日曆(5000個事件)並將其保存在iPhone日曆應用程序中(在事件名稱的開頭使用前綴GW)。然後,如果用戶在iCal中不需要這些事件 - 他可以使用我的功能將其刪除。 – 2010-10-28 08:24:15

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

我認爲如果你使用下面這些代碼行會更好。 – 2011-05-10 16:40:09

+0

你能否請格式化這個。這是非常難以閱讀 – 2011-05-10 16:42:59

+0

我認爲現在更清楚:) – 2011-05-10 16:50:32

1

的iOS 5.0有一個新的removeEvent:方法,它允許您不提交修改,直到最後一刻。我還沒有測試過,但這聽起來正是你在這裏所需要的。