【问题标题】:Understanding Transient properties with NSFetchedResultsController使用 NSFetchedResultsController 了解瞬态属性
【发布时间】:2013-06-01 02:01:44
【问题描述】:

我开始使用 Core Data 创建一个应用程序,以检索我想使用 NSFetchedResultController 的分段表的数据,在来自苹果的 example 中有两个附加属性。

  • 原始时间戳
  • primitiveSectionIdentifier

对于primitiveSectionIdentifier,苹果表示

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

因为 sectionidentifier 是瞬态属性。 但是 timeStamp 呢?这个属性不是瞬态的,为什么会有一个原始的TimeStamp 属性?以及为什么有明确的 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];
}

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

【问题讨论】:

    标签: ios core-data nsfetchedresultscontroller transient


    【解决方案1】:

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

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

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

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

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

    “为什么有明确的设置器用于 timeStamp ?”

    这是必需的,因为设置时间戳需要重新计算“sectionIdentifier”。这是通过将其设置为 no nil 并让 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 声明的属性功能,如“声明”中所述。

    【讨论】:

    • 感谢您的回答,但我不太明白所有这些带有原始前缀的属性的含义。因为据我了解,Core Data 会为实体中的所有属性生成原始 getter 和 setter 对吗?您能否也解释一下为什么单个属性有两个属性
    猜你喜欢
    • 2023-03-19
    • 1970-01-01
    • 2016-11-17
    • 2012-05-15
    • 2011-02-10
    • 2017-04-29
    • 2019-12-06
    • 2011-11-13
    • 2023-03-29
    相关资源
    最近更新 更多