Как инициировать уведомления, когда элемент, добавленный или удаленный из NSSet отношения NSManagedObject к базовым данным?

Каков правильный способ запуска NSNotification всякий раз, когда элемент добавляется или удаляется из отношения / NSSet для многих в пользовательском подклассе NSManagedObject ?

У меня есть пользовательский подкласс NSManagedObject который имеет беспорядочное отношение «один ко многим» к другому подклассу NSManagedObject . Для ясности, скажем, эти два подкласса являются Teacher и Student , где один Teacher может иметь несколько объектов Student но каждый Student присваивается только одному Teacher .

Я хотел бы иметь возможность инициировать уведомление всякий раз, когда Student добавляется или удаляется из Teacher , независимо от того, был ли Student просто назначен Teacher или из него, или потому, что Student был полностью удален из Core Data.

Я пытался использовать KVO, но похоже, что вы не можете добавить наблюдателя в свойство count NSSet добавьте наблюдателя в свойство @dynamic . Кроме того, я попытался реализовать свой собственный метод доступа к многим, как описано в документации Apple , но при тестировании кажется, что мои пользовательские методы доступа никогда не вызываются. В случае, если что-то не так с моей реализацией, вот как я реализовал его в Teacher :

 @implementation Teacher @dynamic students; - (void)addStudentsObject:(Student *)value { NSSet *changedObjects = [[NSSet alloc] initWithObjects:&value count:1]; [self willChangeValueForKey:NSStringFromSelector(@selector(students)) withSetMutation:NSKeyValueUnionSetMutation usingObjects:changedObjects]; [[self primitiveStudents] addObject:value]; [self didChangeValueForKey:NSStringFromSelector(@selector(students)) withSetMutation:NSKeyValueUnionSetMutation usingObjects:changedObjects]; [[NSNotificationCenter defaultCenter] postNotificationName:NOTIFICATION_TEACHER_STUDENT_WAS_ADDED object:self]; } - (void)removeStudentsObject:(Student *)value { NSSet *changedObjects = [[NSSet alloc] initWithObjects:&value count:1]; [self willChangeValueForKey:NSStringFromSelector(@selector(students)) withSetMutation:NSKeyValueMinusSetMutation usingObjects:changedObjects]; [[self primitiveStudents] removeObject:value]; [self didChangeValueForKey:NSStringFromSelector(@selector(students)) withSetMutation:NSKeyValueMinusSetMutation usingObjects:changedObjects]; [[NSNotificationCenter defaultCenter] postNotificationName:NOTIFICATION_TEACHER_STUDENT_WAS_REMOVED object:self]; } - (void)addStudents:(NSSet *)values { [self willChangeValueForKey:NSStringFromSelector(@selector(students)) withSetMutation:NSKeyValueUnionSetMutation usingObjects:values]; [[self primitiveStudents] unionSet:values]; [self didChangeValueForKey:NSStringFromSelector(@selector(students)) withSetMutation:NSKeyValueUnionSetMutation usingObjects:values]; [[NSNotificationCenter defaultCenter] postNotificationName:NOTIFICATION_TEACHER_STUDENTS_WERE_ADDED object:self]; } - (void)removeStudents:(NSSet *)values { [self willChangeValueForKey:NSStringFromSelector(@selector(students)) withSetMutation:NSKeyValueMinusSetMutation usingObjects:values]; [[self primitiveStudents] minusSet:values]; [self didChangeValueForKey:NSStringFromSelector(@selector(students)) withSetMutation:NSKeyValueMinusSetMutation usingObjects:values]; [[NSNotificationCenter defaultCenter] postNotificationName:NOTIFICATION_TEACHER_STUDENTS_WERE_REMOVED object:self]; } ... @end 

Основная проблема заключается в том, что причудливые примеры доступа в Документах Apple, которые вы использовали в качестве ссылки, на самом деле не все аксессоры для отношений. Это дополнительные удобства, которые вы можете реализовать, если хотите. Но из-за того, что вы пытаетесь вставить свой код, переопределив все сеттеры (или все, что вы хотите вызвать для аксессуаров для мутирования), вам также необходимо переопределить самый базовый сеттер.

Самыми основными аксессуарами для отношения ко многим являются сеттеры и геттеры для объекта NSSet для всех отношений. В вашем случае - (NSSet*) students и - (void) setStudents:(NSSet*)students .

Итак, как минимум, ваше уведомление должно быть опубликовано в setStudents :

 -(void) setStudents:(NSSet*)students{ [self willChangeValueForKey:@"students"]; [self setPrimitiveValue:students forKey:@"students"]; [self didChangeValueForKey:@"students"]; [[NSNotificationCenter defaultCenter] postNotificationName:NOTIFICATION_TEACHER_STUDENTS_WERE_ADDED object:self]; } 

Это установщик, который используется по умолчанию.

  • не может вызывать инициализатор для типа SKproductsRequest с типом аргумента (productIdentifiers: Set <NSObject>)
  • Преобразовать набор управляемых объектов в словарь?
  • Захват случайной записи в NSDictionary
  • iOS, Core Data: заданный аргумент не является ошибкой NSSet при подсчете NSSet
  • Давайте будем гением компьютера.