Как определить, какой EKevent был изменен

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

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

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


person Ivan Titkov    schedule 23.04.2013    source источник


Ответы (1)


Это обнаружит измененные события и зарегистрирует заголовки событий в диапазоне дат. Хотя в итоге я этого не сделал, потому что на практике я не знаю диапазон дат. Мне нужно сравнить со всеми событиями, с которыми я работаю, что означает, что мне все равно нужно обновить их, поскольку идентификаторы объектов могли измениться. Это приводит к тому, что каждое событие становится не таким полезным, и теперь я просто обновляю его каждые несколько секунд, когда происходят изменения, и игнорирую детали. Я надеюсь, что 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;
            }
        }];
    }];
}
person Symmetric    schedule 07.08.2013
comment
какие-нибудь подсказки, будет ли это принято в AppStore? objectID в этом случае кажется вызовом «частного API». - person alex-i; 10.12.2013
comment
Я использовал это только для экспериментов, поэтому я не знаю. Я думаю, что обнаружил, что EKEvents будут реагировать на objectID, предполагая, что они были NSManagedObjects внутри (отсюда и приведение типов), но, похоже, это не так, если смотреть на суперклассы. - person Symmetric; 11.12.2013