gpt4 book ai didi

objective-c - 自定义核心数据生成访问器

转载 作者:技术小花猫 更新时间:2023-10-29 11:22:08 24 4
gpt4 key购买 nike

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

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

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

最佳答案

您可以覆盖核心数据生成的访问器。您必须注意一些特殊的事情,例如调用 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 总是被调用,即使没有任何改变。

关于objective-c - 自定义核心数据生成访问器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9659028/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com