2015-07-20 74 views
0

我正在製作一個應用程序,用於將某些事件同步到iPhone上的日曆。EventKit日曆的最後一個事件

的問題是,我沒有辦法告訴哪些事件改變/刪除/ ... 所以我需要刪除所有今天和日曆的前「最後一個事件的結束日期之間的事件同步'(讀取插入)新事件。

據我所看到的,在做一次對多個事件的操作的唯一途徑,是通過使用enumerateEventsMatchingPredicate:usingBlock:predicateForEventsWithStartDate:endDate:calendars:

但爲了這個,我需要一個具體的結束日期。 (因此,我的日曆中的最後一個事件的結束日期)

我總是可以保存我插入到日曆中的最後一個事件的事件標識符,但我寧願不要這樣做: 如果用戶卸載我的應用程序並稍後再安裝它,我沒有最後的事件標識符了。 (因爲他沒有手動刪除日曆)

我可以在每次需要同步日曆時刪除日曆,但是我會失去所有通過的事件。

任何想法或提示,非常感謝!

回答

0

對於您的評論:

我似乎無法找到任何方式來獲取日曆的所有事件。

其實你可以獲取從日曆中所有活動:

NSDate *start = ... 
NSDate *finish = ... 

// use Dictionary for remove duplicates produced by events covered more one year segment 
NSMutableDictionary *eventsDict = [NSMutableDictionary dictionaryWithCapacity:1024]; 

NSDate* currentStart = [NSDate dateWithTimeInterval:0 sinceDate:start]; 

int seconds_in_year = 60*60*24*365; 

// enumerate events by one year segment because iOS do not support predicate longer than 4 year ! 
while ([currentStart compare:finish] == NSOrderedAscending) { 

    NSDate* currentFinish = [NSDate dateWithTimeInterval:seconds_in_year sinceDate:currentStart]; 

    if ([currentFinish compare:finish] == NSOrderedDescending) { 
     currentFinish = [NSDate dateWithTimeInterval:0 sinceDate:finish]; 
    } 
    NSPredicate *predicate = [eventStore predicateForEventsWithStartDate:currentStart endDate:currentFinish calendars:nil]; 
    [eventStore enumerateEventsMatchingPredicate:predicate 
             usingBlock:^(EKEvent *event, BOOL *stop) { 

              if (event) { 
               [eventsDict setObject:event forKey:event.eventIdentifier]; 
              } 

             }];  
    currentStart = [NSDate dateWithTimeInterval:(seconds_in_year + 1) sinceDate:currentStart]; 

} 

NSArray *events = [eventsDict allValues]; 
+0

但這就是一個固定的結束日期,不是嗎? – SnyersK

+0

您可以更改日期並在需要時調用它 –

+0

是的,但是我仍然需要提供一個結束日期,這正是我不知道的一件事。我並不需要最後的事件,我需要該事件的結束日期。如果我使用這個,我可能會更好地將未來的隨機日期作爲我的謂詞的結束日期。 – SnyersK

相關問題