核心数据:实现依赖于其他的属性

时间:2011-09-13 20:08:35

标签: ios core-data properties

我的项目中有以下情况(我使用Core Data):我有一个实体,它有两个BOOL属性:isCompleted和isNonVisit。它还有第三个属性:NSNumber * status - 属性的值取决于isCompleted和isNonVisit值。

当BOOL属性中的任何一个发生更改时,我希望status属性自动实现。

所有三个属性必须存在于底层数据库中,因为我使用了fetchedResultsController,它使用了status属性(作为排序描述符和sectionNameKeyPath)。

我想出了以下解决方案:

在.h文件中

@property (nonatomic, retain) NSNumber *isCompleted;
@property (nonatomic, retain) NSNumber *isNonVisit;
@property (nonatomic, retain) NSNumber *status;

- (NSNumber *)calculateStatus;  //Returns proper status value based on isCompleted and nonVisit property values.
在.m文件中

@dynamic isCompleted;
@dynamic isNonVisit;
@dynamic status;

- (void)setIsCompleted:(NSNumber *)newValue
{
  [self willChangeValueForKey:@"isCompleted"];
  [self setPrimitiveValue:newValue forKey:@"isCompleted"];
  [self didChangeValueForKey:@"isCompleted"];

  self.status = [self calculateStatus];
}


- (void)setIsNonVisit:(NSNumber *)newValue
{
  [self willChangeValueForKey:@"isNonVisit"];
  [self setPrimitiveValue:newValue forKey:@"isNonVisit"];
  [self didChangeValueForKey:@"isNonVisit"];

  self.status = [self calculateStatus];
}

解决方案似乎有效。

所以,我的问题是:可以吗?我是否违反了CoreData或KVO的一些规则?

感谢您的任何建议。

1 个答案:

答案 0 :(得分:1)

你的方法似乎很合理。

我唯一的建议是通过使用访问器方法从状态中提取布尔信息而不是存储它们来减少冗余。您仍然应该能够使用状态变量为您的获取请求使用所需的谓词。但是存储这些额外信息的开销应该是最小的。