【问题标题】:Customizing core data generated accessors自定义核心数据生成的访问器
【发布时间】:2012-03-28 09:04:11
【问题描述】:

我已经建立了一个简单的核心数据模式,其中项目对象被添加到列表对象中。生成类后,核心数据生成了标准访问器,包括向列表添加项目的几种方法(list.addItemsObjects 和 list.addItems:)。

我还想为每个项目添加一个“dateAdded”NSDate。现在,我可以在每次创建对象时手动设置它,因为核心数据将为我提供 item.dateAdded 访问器。但实际上,我更希望这是由列表本身处理的,因为实现永远不会改变。所以每次我调用list.AddItemObject时,我希望它同时设置item的dateAdded属性。我想我也需要反过来做同样的事情,所以 item.setList 也设置了 dateAdded。

我不知道该怎么做。我应该尝试重新定义现有的核心数据生成访问器吗?如果是这样,我该怎么做(有没有办法在我的自定义代码中调用原始实现,以便处理反向关系以及任何其他核心数据必需品)?或者有没有更好的方法来自定义这些方法?

【问题讨论】:

    标签: objective-c ios core-data


    【解决方案1】:

    您可以覆盖核心数据生成的访问器。 您必须注意一些特殊的事情,例如调用 willChangeValueForKeydidChangeValueForKey,但除此之外,覆盖访问器几乎与往常一样。

    阅读 Apple 文档:https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/CoreData/Articles/cdAccessorMethods.html

    用大量的例子解释得很清楚。请注意一对一和一对多关系之间的区别。

    您不需要实现反向功能,这是由 Core Data 完成的。如果你拨打list.AddItem,那么item.setList会自动为你拨打。

    所以只需将您想要的代码添加到item.setList 访问器。这样,您可以保证每次将项目添加到列表中时,日期都会相应更新。不要打扰列表访问器。

    您的代码将类似于:

    - (void)setList:(List *)value
    {
        [self willChangeValueForKey:@"list"];
        [self setPrimitiveValue:[NSDate date] forKey:@"dateAdded"]; // use setValue:forKey: if you need KVO for dateAdded
        [self setPrimitiveValue:value forKey:@"list"];
        [self didChangeValueForKey:@"list"];
    }
    

    编辑我已经考虑过,您可能想知道以下内容:

    如果您自定义列表方法(即addItemObject),您还需要自定义setItems。另外,如果您的项目被添加到一个列表中,而该列表恰好不是您自定义的列表,那么您的自定义代码当然不会被调用。

    另一方面,如果您自定义setList 方法,则如果项目没有更改,则调用代码。

    例如,如果您调用

    [list addItems:[NSSet setWithObject:item]];
    [list addItemsObject:item];
    

    那么项目的setList 访问器只会被调用一次!直接调用item.setList 总是会被调用,即使没有任何改变。

    【讨论】:

    • 谢谢。我已经扫描它并且现在完全阅读它。我没有看到提到的一部分 - 我需要对反向访问器应用相同的自定义吗?即在我自定义了list.addItemObject之后,我还应该自定义item.setList吗?
    • 谢谢,这对我来说已经足够了。但是,我没有将更简单的 setList 添加到相反的 list.addItemsObject 中(参考 to-many 文档)。我发现当我调用 item.setList 时它不会被调用。
    • 如果发生这种情况,还有另一个编辑可以为您节省一些调试时间:-)
    • 谢谢!这就是我需要的。
    • 由于上述链接的 Apple 文档已损坏,您可以在此处找到文档:stpeterandpaul.ca/tiger/documentation/Cocoa/Conceptual/CoreData/…
    猜你喜欢
    • 1970-01-01
    • 2013-11-13
    • 2012-06-02
    • 1970-01-01
    • 2013-03-30
    • 1970-01-01
    • 2013-04-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多