2012-04-14 75 views
2

我在我的应用程序中使用了CoreData。我想将所有CoreData相关的东西抽象为一个API,以便消耗可以使用API​​而不是直接使用CoreData及其生成的模型对象。 CoreData生成管理对象模型如下API的CoreData模型对象

@interface Person : NSManagedObject 

@end 

我想确定我的例如MyAPI API,它有一个叫功能

createPerson:(Person*)p; 

所以这createPerson API的消费者需要创建一个Person数据对象(如Java世界中的POJO)并调用此API。但我不能创建使用

Person *p = [Person alloc] init] 

,因为由CoreData创造了这个人物模型的指定初始化不允许这种类型的创作Person对象。

因此,我应该定义相应的面向用户的数据对象可能是PersonDO,而这个API应该把这些数据带入API实现?

我的方法正确吗?任何专家建议如果以这种方式设计API是一种很好的设计模式?

回答

2

您不能在不处理Managed Object Context的情况下使用CoreData。您必须从上下文中获取人员并将其保存在上下文中。如果你不想让你的客户处理这个问题,并且你的应用中没有使用不同的线程,那么你可以创建一个api,它将调用你的appdelegate的Managed Object Context,并且所有用户都需要做的只是调用该方法。

例如,你可以使用全自动的核心数据产生的方法,使您的API这样的:

+ (Person *)newPersonWithAttributes:(NSDictionary *)userInfo { 

    // Call the designated initializer, but customer 
    // doesn't need to think about managed object context 
    return [Person initPesonWithAttributes:userInfo 
        inManagedObjectContext:[[AppDelegate sharedAppDelegate] managedObjectContext]]; 
} 
+0

看起来这应该是一个类方法。用'+'代替' - '。 – 2012-04-14 06:52:28

+0

另外,还需要很多其他的东西......除非其他东西,除非在NSManagedObject上添加类别以便在上下文中调用“save”,否则不切实际。 – 2012-04-14 06:54:13

+0

是的,它应该被添加到categoey,既机智保存,删除,和所有其他的东西 – 2012-04-14 06:56:03

1

你需要很多的东西抽象了这一点。 RestKit提供了这样的机制。更轻的重量将是InnerBand(请参阅教程InnerBand CoreData) - 尽管它不会自动确定多线程的线程/队列。

但是,它是一个非常简单的API,应该给你你想要的大部分。