2012-04-14 78 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,應該給你你想要的大部分。