使用NSFetchedResultsController了解瞬态属性

时间:2013-06-05 11:29:19

标签: ios core-data nsfetchedresultscontroller transient

我开始使用Core Data创建一个应用程序,为我想要使用NSFetchedResultController的分段表检索数据,在Apple的example中有两个额外的属性。

  • primitiveTimeStamp
  • primitiveSectionIdentifier

对于 primitiveSectionIdentifier 的情况,apple说

  

相反,对于瞬态属性,您可以指定两个属性和   你必须编写代码来执行转换。

因为sectionidentifier是瞬态属性。 但是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];
}

或者它可能不是真正的二传手? _timeStamp = newDate在哪里?

1 个答案:

答案 0 :(得分:4)

CoreData为您生成访问者。它为模型属性生成“公共和原始get和set访问器方法”。

所以在这种情况下它已生成:

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

“为什么有一个primitiveTimeStamp属性?”

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

“为什么timeStamp有明确的setter?”

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

“_timeStamp = newDate在哪里?”

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

文档引用:

默认情况下,Core Data为托管对象类的建模属性(属性和关系)动态创建高效的公共和原始 get和set访问器方法。这包括键值编码可变代理方法,如addObject:和removed:,详见mutableSetValueForKey的文档: - 托管对象是所有多对多关系的有效可变代理。

注意:如果您选择实现自己的访问器,则动态生成的方法永远不会替换您自己的代码。 例如,给定具有属性firstName的实体,Core Data会自动生成firstName,setFirstName:,primitiveFirstName和setPrimitiveFirstName:。 Core Data甚至为NSManagedObject表示的实体执行此操作。要在调用这些方法时禁止编译器警告,应使用Objective-C 2.0声明的属性功能,如“声明”中所述。