2013-04-23 3 views
3

У меня проблема. Мне нужно знать, когда события в моей EventStore изменяются, поэтому в этом случае я использую EKEventStoreChangedNotification но этого уведомления возвращайся ко мне непостижимым словаря в userInfo Это выглядит следующим образом:Как определить, какой EKevent был изменен

EKEventStoreChangedObjectIDsUserInfoKey = ("x-apple-eventkit:///Event/p429"); 

Я не знаю, как я могу используйте эти данные для доступа к измененному объекту. Пожалуйста, помогите мне

ответ

5

Это обнаружит измененные события и зарегистрирует названия событий в диапазоне дат. Хотя, я не сделал этого, потому что на практике я не знаю диапазон дат. Мне нужно сравнить со всеми событиями, с которыми я работаю, что означает, что мне нужно обновить их, так как идентификаторы объектов могли быть изменены. Это приводит к тому, что каждое событие не так полезно, и теперь я просто обновляюсь каждые несколько секунд, когда происходят изменения и игнорируются детали. Я надеюсь, что 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; 
      } 
     }]; 
    }]; 
} 
+0

любые подсказки, если это будет принято в AppStore? 'objectID', похоже, является вызовом« private api »в этом случае. –

+1

Я использовал это только для экспериментов, поэтому не знаю. Я думаю, что я обнаружил, что EKEvents ответят на objectID, предположив, что они были NSManagedObjects внутренне (отсюда и тип), но, похоже, это не так, глядя на суперклассы. – Symmetric

Смежные вопросы