问题描述
我遇到了问题.我需要知道我的 EventStore 中的事件何时发生更改,因此对于这种情况,我使用 EKEventStoreChangedNotification 但此通知返回给我在 userInfo 中难以理解的字典它看起来像这样:
EKEventStoreChangedObjectIDsUserInfoKey = ("x-apple-eventkit:///Event/p429" );
我不知道如何使用这些数据来访问已更改的对象.请帮帮我
推荐答案
这将检测更改的事件并记录某个日期范围内的事件标题.虽然,我最终没有这样做,因为实际上我不知道日期范围.我需要与我正在处理的所有事件进行比较,这意味着无论如何我都需要刷新它们,因为对象 ID 可能已经更改.这最终使每个事件都不那么有用,现在我只是在更改出现时每隔几秒钟刷新一次并忽略细节.我希望 Apple 改进这些通知.
#pragma mark - Calendar Changed - (void)calendarChanged:(NSNotification *)notification { EKEventStore *ekEventStore = notification.object; NSDate *now = [NSDate date]; NSDateComponents *offsetComponents = [NSDateComponents new]; [offsetComponents setDay:0]; [offsetComponents setMonth:4]; [offsetComponents setYear:0]; NSDate *endDate = [[NSCalendar currentCalendar] dateByAddingComponents:offsetComponents toDate:now options:0]; NSArray *ekEventStoreChangedObjectIDArray = [notification.userInfo objectForKey:@"EKEventStoreChangedObjectIDsUserInfoKey"]; NSPredicate *predicate = [ekEventStore predicateForEventsWithStartDate:now endDate:endDate calendars:nil]; // Loop through all events in range [ekEventStore enumerateEventsMatchingPredicate:predicate usingBlock:^(EKEvent *ekEvent, BOOL *stop) { // Check this event against each ekObjectID in notification [ekEventStoreChangedObjectIDArray enumerateObjectsUsingBlock:^(NSString *ekEventStoreChangedObjectID, NSUInteger idx, BOOL *stop) { NSObject *ekObjectID = [(NSManagedObject *)ekEvent objectID]; if ([ekEventStoreChangedObjectID isEqual:ekObjectID]) { // Log the event we found and stop (each event should only exist once in store) NSLog(@"calendarChanged(): Event Changed: title:%@", ekEvent.title); *stop = YES; } }]; }]; }