2013-06-05 47 views
2

我开始创建一个应用程序与核心数据,检索数据的分段表我想使用NSFetchedResultController,在example从苹果有两个额外的属性。了解NSFetchedResultsController的瞬态属性

  • primitiveTimeStamp
  • primitiveSectionIdentifier

对于primitiveSectionIdentifier苹果的情况下说,

与此相反,瞬时属性指定的两个属性和 你必须编写代码执行转换。

因为sectionidentifier是transient属性。 但timeStamp呢?这个属性不是一个瞬态的,​​为什么有一个primitiveTimeStamp属性?以及为什么timeStamp有明确的setter?

- (void)setTimeStamp:(NSDate *)newDate { 

    // If the time stamp changes, the section identifier become invalid. 
    [self willChangeValueForKey:@"timeStamp"]; 
    [self setPrimitiveTimeStamp:newDate]; 
    [self didChangeValueForKey:@"timeStamp"]; 

    [self setPrimitiveSectionIdentifier:nil]; 
} 

或者它可能不是一个实际的setter? _timeStamp = newDate在哪里?

回答

4

CoreData为您生成访问器。它生成“公共和原始获取和设置建模属性的访问器方法”。

所以在这种情况下,它已经产生:

-(NSDate*)timeStamp; 
-(void)setTimeStamp:; 
-(NSDate*)primitiveTimeStamp; 
-(void)setPrimitiveTimeStamp:; 

“为什么有primitiveTimeStamp财产?”

该声明仅仅是为了压制编译器警告。即。如果您删除了该属性的声明,则会在编译时发现警告,但代码仍会运行。 或者你也可以使用[self setPrimitiveValue:newDate forKey:@"timeStamp"];

“为什么有对于timestamp明确的制定者?”

这是必需的,因为设置timeStamp需要重新计算'sectionIdentifier'。这是通过将其设置为nil并让get访问器重新计算它来实现的。

“where is _timeStamp = newDate?”

这相当于基本上在setPrimitiveTimeStamp的自动生成实现中完成。

引自文档:

默认情况下,核心数据动态创建高效公众和原始 get和set访问方法建模属性(属性和关系)管理的对象类。这包括键值编码可变代理方法,如addObject:和removed:,如在mutableSetValueForKey的文档中详细描述的: - 管理对象对于其所有多对多关系都是有效的可变代理。

注意:如果您选择实现自己的访问器,则动态生成的方法不会替换您自己的代码。 例如,给定一个具有属性firstName的实体,Core Data会自动生成firstName,setFirstName:,primitiveFirstName和setPrimitiveFirstName :.核心数据即使对于由NSManagedObject表示的实体也是如此。要在调用这些方法时抑制编译器警告,应该使用Objective-C 2.0声明的属性功能,如“声明”中所述。

+0

谢谢你的回答,但我并不完全理解所有这些属性的含义原始前缀。因为据我了解,核心数据会为Entity中的所有属性生成原始getter和setter?你能否请你解释为什么有两个属性单个属性 – taffarel