扩展NSManagedObject实体对象是否安全

时间:2013-09-27 00:24:34

标签: iphone ios objective-c core-data nsmanagedobject

我正在为iPhone制作应用程序。我正在使用核心数据来存储大量信息,但却遇到了轻微的绊脚石。

作为一个非常简单的例子,我有一个具有密码属性的实体。此属性是可选的。

我已经自动生成了一个NSManagedObject子类。

我想做的是扩展这个子类,原因如下。密码是可选的。如果用户决定该应用程序不应该记住密码,那么我想要一个用于此属性的客户获取者和设置者。

setter会检查是否应该存储密码。如果它应该然后它将它传递给实体子类。如果不是我自己的子类存储信息。

getter将检查密码所在的位置并将其返回。

无论密码是否存储在核心数据模型中,优势都是类的行为相同。

我试图做一些搜索,看看这是否会引起任何问题,但目前还没有真正发现。

1 个答案:

答案 0 :(得分:1)

是的,这样做很好。您可以通过category子类中的setters或自定义gettersNSManagedObject来执行此操作。

但是, 要谨慎使用自定义settersgetters

您需要使用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];
}