Ios 在关系中添加/删除对象时更新属性

Ios 在关系中添加/删除对象时更新属性,ios,objective-c,core-data,Ios,Objective C,Core Data,以这种模式为例: @class Patient; @interface Hospital : NSManagedObject @property (nonatomic, retain) NSString * name; @property (nonatomic, retain) NSNumber * patientCount; @property (nonatomic, retain) NSSet *patients; @end @interface Hospital (CoreDataG

以这种模式为例:

@class Patient;

@interface Hospital : NSManagedObject

@property (nonatomic, retain) NSString * name;
@property (nonatomic, retain) NSNumber * patientCount;
@property (nonatomic, retain) NSSet *patients;
@end

@interface Hospital (CoreDataGeneratedAccessors)

- (void)addPatientsObject:(Patient *)value;
- (void)removePatientsObject:(Patient *)value;
- (void)addPatients:(NSSet *)values;
- (void)removePatients:(NSSet *)values;

@end
每次添加或删除患者时,我都要更新
patientCount
。如果这是一个普通属性,我会简单地覆盖setter/getter,但是因为它们是由核心数据生成的,所以我不知道怎么做


什么是正确的方法?我不想仅仅为了数病人而去拿病人,我也不想用KVO来做这么简单的事情。

你知道你可以直接从医院获得病人数。病人数。计数?为什么要为它保留一个属性呢

但如果必须,则在managedObjectSubclass中实现类似于这些的方法,并更新这些方法中的相关属性

    - (void)addTasksObject:(TreeNode *)value {    
        NSSet *changedObjects = [[NSSet alloc] initWithObjects:&value count:1];
        [self willChangeValueForKey:@"tasks" withSetMutation:NSKeyValueUnionSetMutation usingObjects:changedObjects];
        [[self primitiveValueForKey:@"tasks"] addObject:value];
        [self didChangeValueForKey:@"tasks" withSetMutation:NSKeyValueUnionSetMutation usingObjects:changedObjects];
        // Add code to update self.patientsCount here
        self.patientsCount = [NSNumber numberWithInt:[self.patientsCount intValue] + 1];
    }

    - (void)removeTasksObject:(TreeNode *)value {
        NSSet *changedObjects = [[NSSet alloc] initWithObjects:&value count:1];
        [self willChangeValueForKey:@"tasks" withSetMutation:NSKeyValueMinusSetMutation usingObjects:changedObjects];
        [[self primitiveValueForKey:@"tasks"] removeObject:value];
        [self didChangeValueForKey:@"tasks" withSetMutation:NSKeyValueMinusSetMutation usingObjects:changedObjects];
        // Add code to update self.patientsCount here (better check not negative)
        self.patientsCount = [NSNumber numberWithInt:[self.patientsCount intValue] - 1];
    }

    - (void)addTasks:(NSSet *)value {    
        [self willChangeValueForKey:@"tasks" withSetMutation:NSKeyValueUnionSetMutation usingObjects:value];
        [[self primitiveValueForKey:@"tasks"] unionSet:value];
        [self didChangeValueForKey:@"tasks" withSetMutation:NSKeyValueUnionSetMutation usingObjects:value];
        self.patientsCount = [NSNumber numberWithInt:self.patients.count];
    }

    - (void)removeTasks:(NSSet *)value {
        [self willChangeValueForKey:@"tasks" withSetMutation:NSKeyValueMinusSetMutation usingObjects:value];
        [[self primitiveValueForKey:@"tasks"] minusSet:value];
        [self didChangeValueForKey:@"tasks" withSetMutation:NSKeyValueMinusSetMutation usingObjects:value];
        self.patientsCount = [NSNumber numberWithInt:self.patients.count];
    }

问题是,如果我进行计数,即使所有对象都出现故障,核心数据也会命中磁盘以获取关系,这是我想要避免的。另外,代码不需要设置反向关系吗?我认为Knuth引用适用于这里,关于过早优化的引用。我认为CoreData足够聪明来处理这个问题。如果你真的确定需要这样做,你应该看看CachedAggregate设计模式,或者Akka中的代理作为一个例子来说明需要什么。我不认为你需要设置反向关系,但最好测试一下以确认这一点。除了说明PatientCount属性设置的行之外,代码来自一个正在工作的应用程序。我相信这段代码是在我从核心数据实体生成子类时由XCode生成的。再次-尝试使用XCode自己生成子类,看看是否得到相同的方法。@Rob你是对的。我决定在应用程序中植入几十家医院,每家医院都有一千名患者,即使使用count Core数据也不会眨眼。难道你不需要考虑对象是否真的添加到了集合中吗?如果对象已存在于集合中,则不会实际添加该对象,并且执行+1将使计数无效。清除也一样。