Как сказать (управляемому) объекту уведомить его KVO о том, что одно из его свойств должно быть восстановлено? - PullRequest
1 голос
/ 25 июля 2009

Когда у нас есть объект, у которого есть свойство, которое генерируется на основе других свойств, обычно мы реализуем метод класса +keyPathsForValuesAffecting{PropertyName}.

То, что я пытаюсь сделать, в основном то же самое для свойствана моем NSManagedObject, но пересекая отношения.

Моя модель проста;У меня есть две сущности: приложение и версия (я создаю приложение, генерирующее приложения). Когда свойства приложения изменяются, поскольку я реализовал описанный выше метод, строка -appcast изменяется, и все привязки обновляются соответствующим образом.

Однако, когда какие-либо свойства в любой из версий конкретного приложения (для многихотношение), свойство -appcast не создается соответствующим образом. Я могу исправить это / обойти?

1 Ответ

3 голосов
/ 01 сентября 2009

Это немного поздний ответ, но я думаю, что это обычная ситуация, и ответ определенно не очевиден.

Обычно я наблюдаю за изменением managedObjectContext, а затем проверяю,любой из измененных объектов - это те, на которые я хочу обратить внимание. Итак, в вашем NSManagedObject подклассе:

// We need to register for the notification in both awakeFromFetch
// AND awakeFromInsert, since either one could be called, depending on
// if the object was previously-created or not
- (void)awakeFromFetch {
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(managedObjectContextDidChange:) name: NSManagedObjectContextObjectsDidChangeNotification object:[self managedObjectContext]];
}

- (void)awakeFromInsert {
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(managedObjectContextDidChange:) name: NSManagedObjectContextObjectsDidChangeNotification object:[self managedObjectContext]];
}

- (void)managedObjectContextDidChange:(NSNotification *)notification {
    // Get a set containing ALL objects which have been changed
    NSSet *insertedObjects = [[notification userInfo] objectForKey:NSInsertedObjectsKey];
    NSSet *updatedObjects = [[notification userInfo] objectForKey:NSUpdatedObjectsKey];
    NSSet *deletedObjects = [[notification userInfo] objectForKey:NSDeletedObjectsKey];

    NSSet *changedObjects = [insertedObjects setByAddingObjectsFromSet:updatedObjects];
    changedObjects = [changedObjects setByAddingObjectsFromSet:deletedObjects];

    if ([changedObjects intersectsSet:[self versions]]) {
        [self willChangeValueForKey:@"appCast"];
        [self didChangeValueForKey:@"appCast"];
    }
}

Это, безусловно, не идеально с точки зрения производительности, так как это уведомление будет запускаться каждый раз, когда что-либо в вашем объектном графе изменяется, но я нашел егочтобы быть самым простым способом сделать это.

...