我正在为iPhone制作应用程序。我正在使用核心数据来存储大量信息,但却遇到了轻微的绊脚石。
作为一个非常简单的例子,我有一个具有密码属性的实体。此属性是可选的。
我已经自动生成了一个NSManagedObject子类。
我想做的是扩展这个子类,原因如下。密码是可选的。如果用户决定该应用程序不应该记住密码,那么我想要一个用于此属性的客户获取者和设置者。
setter会检查是否应该存储密码。如果它应该然后它将它传递给实体子类。如果不是我自己的子类存储信息。
getter将检查密码所在的位置并将其返回。
无论密码是否存储在核心数据模型中,优势都是类的行为相同。
我试图做一些搜索,看看这是否会引起任何问题,但目前还没有真正发现。
答案 0 :(得分:1)
是的,这样做很好。您可以通过category
子类中的setters
或自定义getters
和NSManagedObject
来执行此操作。
但是, 要谨慎使用自定义setters
和getters
。
您需要使用NSManagedObject
的实例方法来获取和设置原始值(由数据模型管理)。
要获取基元,请使用primitiveValueForKey:
。要进行设置,请使用setPrimitiveValue:forKey:
。
在这种情况下,我会为password
子类的NSManagedObject
属性创建自定义setter。
像这样的东西
- (void)setPassword:(NSString *)password
{
BOOL shouldSetPassword = ... // your custom logic here to determine if the password should be set or not
if (!shouldSetPassword)
return;
NSString *key = @"password";
NSString *value = [self primitiveValueForKey:key];
if (value == password)
return;
[self willChangeValueForKey:key];
[self setPrimitiveValue:password forKey:key];
[self didChangeValueForKey:key];
}