代码之家  ›  专栏  ›  技术社区  ›  Nate

iphone-更改实体类(nsmanagedObject)使其可初始化

  •  1
  • Nate  · 技术社区  · 15 年前

    我希望像使用普通对象一样使用自定义nsmanagedObject(以及它的常规函数)。是否可以修改类以便能够像普通对象一样初始化它?

    [[myManagedObject alloc] init];
    

    谢谢

    编辑:为了澄清这个问题,如果我在实现中用@synthesis更改@dynamic,它会把一切都搞砸吗?

    2 回复  |  直到 15 年前
        1
  •  2
  •   TechZen    15 年前

    托管对象上下文是nsmanagedObject的必需属性,因此,如果不将其插入上下文,则无法正确初始化它的实例。它通过查看上下文来了解它的实体,并在其任何属性更改时通知上下文。

    @dynamic和@synthesis只是编译器指令。你可以从@dynamic切换到@synthesis,只要你自己提供合适的getter和setter。由于nsmanagedObject很大程度上依赖于观察到的键值来工作,因此您必须编写符合kvo的访问器。

    如果需要初始化nsmanagedObject子类,则重写 awakeFromInsert 这将允许您在创建实例时对其进行自定义。每次提取对象时,也可以使用自定义对象 awakeFromFetch .

        2
  •  3
  •   gotosleep    15 年前

    我经常在我的一个应用程序中这样做。我的方法是用以下方法初始化对象:

    -(id)initWithEntity:(NSEntityDescription *)entity insertIntoManagedObjectContext:(NSManagedObjectContext *)context
    

    在上下文中传递nil。要获取实体描述,您需要访问ManagedObjectContext。我倾向于在应用程序启动时获取实体描述,然后将其存储在应用程序委托中的实例变量中。

    下面是一个例子:

    //inside my "Engine" class
    self.tweetEntity = [NSEntityDescription entityForName:@"Tweet" inManagedObjectContext:self.moc];
    
    //later on when I want an NSManagedObject but not in a managed object context
    Tweet *tweet = [[[Tweet alloc] initWithEntity:self.engine.tweetEntity insertIntoManagedObjectContext:nil] autorelease];
    

    这允许我使用nsmanagedObjects,而不将它们存储在数据库中。稍后,如果我决定要将对象插入数据库,我可以将其插入托管对象上下文:

    [self.moc insertObject:tweet];