taf*_*rel 4 core-data transient nsfetchedresultscontroller ios
我开始使用 Core Data 创建一个应用程序,以检索我想使用 NSFetchedResultController 的分段表的数据,在来自苹果的示例中有两个附加属性。
对于primitiveSectionIdentifier的情况,苹果说
相反,对于瞬态属性,您需要指定两个属性,并且必须编写代码来执行转换。
因为 sectionidentifier 是瞬态属性。但是 timeStamp 呢?这个属性不是瞬态的,为什么会有一个primitiveTimeStamp 属性?为什么有明确的 timeStamp 设置器?
- (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];
}
Run Code Online (Sandbox Code Playgroud)
或者它可能不是一个真正的二传手?_timeStamp=newDate 在哪里?
CoreData 为您生成访问器。它生成“用于建模属性的公共和原始获取和设置访问器方法”。
所以在这种情况下,它产生了:
-(NSDate*)timeStamp;
-(void)setTimeStamp:;
-(NSDate*)primitiveTimeStamp;
-(void)setPrimitiveTimeStamp:;
Run Code Online (Sandbox Code Playgroud)
“为什么有一个primitiveTimeStamp 属性?”
该声明只是为了抑制编译器警告。IE。如果您删除了属性的声明,您会在编译时发现警告,但代码仍会运行。或者你可以使用[self setPrimitiveValue:newDate forKey:@"timeStamp"];
“为什么 timeStamp 有明确的设置器?”
这是必需的,因为设置时间戳需要重新计算“sectionIdentifier”。这是通过将其设置为 nonil并让 get 访问器延迟重新计算来实现的。
“_timeStamp=newDate 在哪里?”
等价的基本上是在自动生成的setPrimitiveTimeStamp.
来自文档的引用:
默认情况下,Core Data为托管对象类的建模属性(属性和关系)动态创建有效的公共和原始get 和 set 访问器方法。这包括键值编码可变代理方法,例如 addObject: 和 removes:,如 mutableSetValueForKey: 的文档中所详述:托管对象是其所有对多关系的有效可变代理。
注意:如果您选择实现自己的访问器,动态生成的方法永远不会替换您自己的代码。例如,给定一个具有属性 firstName 的实体,Core Data 会自动生成 firstName、setFirstName:、primitiveFirstName 和 setPrimitiveFirstName:。Core Data 甚至对 NSManagedObject 表示的实体也这样做。要在调用这些方法时抑制编译器警告,您应该使用 Objective-C 2.0 声明的属性功能,如“声明”中所述。
| 归档时间: |
|
| 查看次数: |
879 次 |
| 最近记录: |