2011-09-13 33 views
2

我已经在我的项目下列情况下(在我使用的核心数据):我有两个BOOL性质的实体:isCompleted和isNonVisit。它还具有第三个属性:NSNumber * status - 属性的值取决于isCompleted和isNonVisit值。核心数据:实现属性是依赖于其他

当任的BOOL属性发生变化,我想状态属性被自动actualised。

所有三个属性必须存在于底层的数据库,因为我用fetchedResultsController,使得使用状态属性(如排序描述符和sectionNameKeyPath)。在.h文件中

:在.m文件

@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. 

我想出了以下解决方案

@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

谢谢。你是对的。但为什么我将isCompleted和isNonVisit存储在单独的字段中的原因是这些属性在以前版本的应用程序中使用,而状态属性是新的。这就是为什么我不想删除旧的(当然它仍然有可能摆脱它们)。 – manicaesar