我开始使用 Core Data 创建一个应用程序,以检索我想要使用 NSFetchedResultController 的分段表的数据,在 example 中从苹果那里有两个额外的属性。
对于 primitiveSectionIdentifier 的情况,苹果表示
In contrast, with transient properties you specify two attributes and you have to write code to perform the conversion.
因为 sectionidentifier 是 transient 属性。 但是 timeStamp 呢?这个属性不是 transient 的,为什么会有一个原始的TimeStamp 属性?以及为什么有明确的 timeStamp setter ?
- (void)setTimeStampNSDate *)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 在哪里?
CoreData 为您生成访问器。它生成“用于建模属性的公共(public)和原始 get 和 set 访问器方法”。
所以在这种情况下它已经生成了:
-(NSDate*)timeStamp;
-(void)setTimeStamp:;
-(NSDate*)primitiveTimeStamp;
-(void)setPrimitiveTimeStamp:;
“为什么有一个primitiveTimeStamp 属性?”
声明只是为了抑制编译器警告。 IE。如果您删除了该属性的声明,您会发现编译时出现警告,但代码仍会运行。
或者你也可以使用 [self setPrimitiveValue:newDate forKey"timeStamp"];
“为什么有明确的 setter 用于 timeStamp ?”
这是必需的,因为设置时间戳需要重新计算“sectionIdentifier”。这是通过将其设置为不 nil
并让 get 访问器延迟重新计算来实现的。
“_timeStamp=newDate 在哪里?”
这基本上是在 setPrimitiveTimeStamp
的自动生成实现中完成的。
来自文档的引用:
默认情况下,Core Data 为托管对象类的建模属性(属性和关系)动态创建高效的公共(public)和原始 get 和 set 访问器方法。这包括键值编码可变代理方法,例如 addObject: 和 removes:,如 mutableSetValueForKey 的文档中所述:托管对象实际上是它们所有对多关系的可变代理。
注意:如果您选择实现自己的访问器,动态生成的方法永远不会替换您自己的代码。 例如,给定一个具有 firstName 属性的实体,Core Data 会自动生成 firstName、setFirstName:、primitiveFirstName 和 setPrimitiveFirstName:。 Core Data 甚至对由 NSManagedObject 表示的实体也是如此。要在调用这些方法时抑制编译器警告,您应该使用 Objective-C 2.0 声明的属性功能,如“声明”中所述。
关于ios - 使用 NSFetchedResultsController 了解 transient 属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16938764/
欢迎光临 OStack程序员社区-中国程序员成长平台 (https://ostack.cn/) | Powered by Discuz! X3.4 |